本人刚学VC++,如果我建立了一个Win32 Application(小弟现在还看不懂MFC)
怎么用MFC的类库?比如我声明一个 CString myString;编译是不会出错,连接时就出错:
error LNK2001: unresolved external symbol __endthreadex
nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __beginthreadex
这是怎么回事呢?

解决方案 »

  1.   

    #include <process.h>    /* _beginthread, _endthread */
    and link with LIBCMT.LIB.
      

  2.   

    学习VC++时经常会遇到链接错误LNK2001,该错误非常讨厌,因为对于
    编程者来说,最好改的错误莫过于编译错误,而一般说来发生连接错误时,
    编译都已通过。产生连接错误的原因非常多,尤其LNK2001错误,常常使人不
    明其所以然。如果不深入地学习和理解VC++,要想改正连接错误LNK2001非
    常困难。
      初学者在学习VC++的过程中,遇到的LNK2001错误的错误消息主要为:
      unresolved external symbol “symbol”(不确定的外部“符号”)。
      如果连接程序不能在所有的库和目标文件内找到所引用的函数、变量或
    标签,将产生此错误消息。一般来说,发生错误的原因有两个:一是所引用
    的函数、变量不存在、拼写不正确或者使用错误;其次可能使用了不同版本
    的连接库。
      以下是可能产生LNK2001错误的原因:
      一.由于编码错误导致的LNK2001。
      1.不相匹配的程序代码或模块定义(.DEF)文件能导致LNK2001。例如, 
    如果在C++ 源文件内声明了一变量“var1”,却试图在另一文件内以变量
    “VAR1”访问该变量,将发生该错误。
      2.如果使用的内联函数是在.CPP文件内定义的,而不是在头文件内定
    义将导致LNK2001错误。
      3.调用函数时如果所用的参数类型同函数声明时的类型不符将会产生
    LNK2001。
      4.试图从基类的构造函数或析构函数中调用虚拟函数时将会导致LNK2001。
      5.要注意函数和变量的可公用性,只有全局变量、函数是可公用的。
      静态函数和静态变量具有相同的使用范围限制。当试图从文件外部访问
    任何没有在该文件内声明的静态变量时将导致编译错误或LNK2001。
      函数内声明的变量(局部变量) 只能在该函数的范围内使用。
      C++ 的全局常量只有静态连接性能。这不同于C,如果试图在C++的
    多个文件内使用全局变量也会产生LNK2001错误。一种解决的方法是需要时在
    头文件中加入该常量的初始化代码,并在.CPP文件中包含该头文件;另一种
    方法是使用时给该变量赋以常数。
      二.由于编译和链接的设置而造成的LNK2001
      1.如果编译时使用的是/NOD(/NODEFAULTLIB)选项,程序所需要的运行
    库和MFC库在连接时由编译器写入目标文件模块, 但除非在文件中明确包含
    这些库名,否则这些库不会被链接进工程文件。在这种情况下使用/NOD将导
    致错误LNK2001。
      2.如果没有为wWinMainCRTStartup设定程序入口,在使用Unicode和MFC
    时将得到“unresolved external on _WinMain@16”的LNK2001错误信息。
      3.使用/MD选项编译时,既然所有的运行库都被保留在动态链接库之内,
    源文件中对“func”的引用,在目标文件里即对“__imp__func” 的引用。
    如果试图使用静态库LIBC.LIB或LIBCMT.LIB进行连接,将在__imp__func上发
    生LNK2001;如果不使用/MD选项编译,在使用MSVCxx.LIB连接时也会发生LNK2001。
      4.使用/ML选项编译时,如用LIBCMT.LIB链接会在_errno上发生LNK2001。
      5.当编译调试版的应用程序时,如果采用发行版模态库进行连接也会产
    生LNK2001;同样,使用调试版模态库连接发行版应用程序时也会产生相同的
    问题。
      6.不同版本的库和编译器的混合使用也能产生问题,因为新版的库里可
    能包含早先的版本没有的符号和说明。
      7.在不同的模块使用内联和非内联的编译选项能够导致LNK2001。如果
    创建C++库时打开了函数内联(/Ob1或/Ob2),但是在描述该函数的相应头
    文件里却关闭了函数内联(没有inline关键字),这时将得到该错误信息。
    为避免该问题的发生,应该在相应的头文件中用inline关键字标志内联函数。
      8.不正确的/SUBSYSTEM或/ENTRY设置也能导致LNK2001。
      其实,产生LNK2001的原因还有很多,以上的原因只是一部分而已,对初
    学者来说这些就够理解一阵子了。但是,分析错误原因的目的是为了避免错
    误的发生。LNK2001错误虽然比较困难,但是只要注意到了上述问题,还是能
    够避免和予以解决的。 
      

  3.   

    不行,我已经引用了#include <afx.h>
      

  4.   

    不要笑话小弟,我没加过lib
    是在project-->setting-->Link中加吗?我在这里加了一个LIBCMT.LIB怎么错误又多了,倒是project-->setting-->General中把not using MFC改为using MFC in a static library时连接成功。单独的lib怎么加,怎么知道加那个?
      

  5.   

    晕了,我为了你的问题把msdn.microsoft.com翻遍,用vc6也自己试过。
    错综复杂,头都大了。其实我对这个问题也很感兴趣,明天继续和你一起想办法。
      

  6.   

    先把我的进度汇报一下 :)关于error LNK2001: unresolved external symbol __endthreadex
    nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __beginthreadexalt+F7 >> C/C++的Category:Code Generation下的Use run-time liberary改成Debug Mulitithreaded,也就是/MTd参数然后提示:
    libcmtd.lib(_freebuf.obj) : fatal error LNK1103: debugging information corrupt; recompile module
    Error executing link.exe.
    是不是我的lib文件坏了,手头没有vc安装盘。如果像 jennyvenus() 老大说的,加入那个文件会出现很多重复定义。
    然后,我在 Link>>Category: Input>>Ignore libaries:>> 加入重复的lib还是很多错误。到底哪个包含哪个?哪个调用了哪个lib或dll文件。我也晕了,还请哪为高手指点小弟。To  CoolMoon1001(冷月):
    你在codeguru上也问了吧? 
    :)
      

  7.   

    afx.h中。
    #ifndef _AFXDLL
    #ifndef _UNICODE
    #ifdef _DEBUG
    #pragma comment(lib, "nafxcwd.lib")
    #else
    #pragma comment(lib, "nafxcw.lib")
    #endif
    #else
    #ifdef _DEBUG
    #pragma comment(lib, "uafxcwd.lib")
    #else
    #pragma comment(lib, "uafxcw.lib")
    #endif
    #endif
    #else
    #ifndef _UNICODE
    #ifdef _DEBUG
    #pragma comment(lib, "mfc42d.lib")
    #pragma comment(lib, "mfcs42d.lib")
    #else
    #pragma comment(lib, "mfc42.lib")
    #pragma comment(lib, "mfcs42.lib")
    #endif
    #else
    #ifdef _DEBUG
    #pragma comment(lib, "mfc42ud.lib")
    #pragma comment(lib, "mfcs42ud.lib")
    #else
    #pragma comment(lib, "mfc42u.lib")
    #pragma comment(lib, "mfcs42u.lib")
    #endif
    #endif
    #endif//下面你可以发现msvcrt.lib和LIBC.lib没有UNICODE的区别
    #ifdef _DLL       //using MFC Dynamic Library
    #if !defined(_AFX_NO_DEBUG_CRT) && defined(_DEBUG)
    #pragma comment(lib, "msvcrtd.lib")
    #else
    #pragma comment(lib, "msvcrt.lib")
    #endif
    #else
    #ifdef _MT        //MultiThread
    #if !defined(_AFX_NO_DEBUG_CRT) && defined(_DEBUG)
    #pragma comment(lib, "libcmtd.lib")
    #else
    #pragma comment(lib, "libcmt.lib")
    #endif
    #else
    #if !defined(_AFX_NO_DEBUG_CRT) && defined(_DEBUG)
    #pragma comment(lib, "libcd.lib")
    #else
    #pragma comment(lib, "libc.lib")
    #endif
    #endif
    #endif进入点函数的选择是由C运行库进行的。
    在TCHAR.h中将_tWinMain 定义为 WinMain函数,却没有UNICODE版本的进入点函数。#pragma comment(lib, "kernel32.lib")
    #pragma comment(lib, "user32.lib")
    #pragma comment(lib, "gdi32.lib")
    #pragma comment(lib, "comdlg32.lib")
    #pragma comment(lib, "winspool.lib")
    #pragma comment(lib, "advapi32.lib")
    #pragma comment(lib, "shell32.lib")
    #pragma comment(lib, "comctl32.lib")// force inclusion of NOLIB.OBJ for /disallowlib directives
    #pragma comment(linker, "/include:__afxForceEXCLUDE")// force inclusion of DLLMODUL.OBJ for _USRDLL
    #ifdef _USRDLL
    #pragma comment(linker, "/include:__afxForceUSRDLL")
    #endif// force inclusion of STDAFX.OBJ for precompiled types
    #ifdef _AFXDLL
    #pragma comment(linker, "/include:__afxForceSTDAFX")
    #endif#endif //!_AFX_NOFORCE_LIBS