MSVC编译MFC常见错误

来源:互联网 发布:手机安易数据恢复软件 编辑:程序博客网 时间:2024/04/29 16:30
在最开始的编程过程中,最常出现的错误就是LNK2001这个错误,究其原因,其实一句话可以解释:当程序调用函数(function1)时,没有找到function1具体的实现部分。

最常见的例子和解释:
main or winmain函数:应该是选择工程类型的时候有错误,因为系统会根据
subsystem的选项来决定调用main或winmain作为程序的入口函数,如果是console,
会选择main, 否则如果是windows,则选择winmain。所以,如果程序没有main或者
winmain的实现部分,就会出现LNK2001.
_beginthread, _beginthreadex:程序中隐式调用多线程的东西,比如你使用MFC
的类,所以这是应该选择/MD(use multithread cpp runtime library)编译指令,否则就会出现LNK2001.
api函数:这时应该是没有link相关的Lib文件。因为dll形成的时候,静态的实现部分是放在lib文件,所以你使用函数时,系统会去找它的实现部分,如果没有,就出现
LNK2001.
自己定义的函数:那很明显,就是只声明了函数而没有实现,包括类的函数都是。


下面介绍解决的方法: 
1. Windows子系统设置错误, 提示: 
libcmtd.lib(crt0.obj) : error LNK2001: unresolved external symbol _main 
Windows项目要使用Windows子系统, 而不是Console, 可以这样设置: 
[Project] --> [Settings] --> 选择"Link"属性页, 
在Project Options中将/subsystem:console改成/subsystem:windows 

2. Console子系统设置错误, 提示: 
LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol _WinMain@16 
控制台项目要使用Console子系统, 而不是Windows, 设置: 
[Project] --> [Settings] --> 选择"Link"属性页, 
在Project Options中将/subsystem:windows改成/subsystem:console 

3. 程序入口设置错误, 提示: 
msvcrtd.lib(crtexew.obj) : error LNK2001: unresolved external symbol _WinMain@16 
通常, MFC项目的程序入口函数是WinMain, 如果编译项目的Unicode版本, 程序入口必须改为wWinMainCRTStartup, 所以需要重新设置程序入口: 
[Project] --> [Settings] --> 选择"Link"属性页, 
在Category中选择Output, 
再在Entry-point symbol中填入wWinMainCRTStartup, 即可 


4. 线程运行时库设置错误, 提示: 
nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __beginthreadex 
nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __endthreadex 
这是因为MFC要使用多线程时库, 需要更改设置: 
[Project] --> [Settings] --> 选择"C/C++"属性页, 
在Category中选择Code Generation, 
再在Use run-time library中选择Debug Multithreaded或者multithreaded 
其中, 
Single-Threaded 单线程静态链接库(release版本) 
Multithreaded 多线程静态链接库(release版本) 
multithreaded DLL 多线程动态链接库(release版本) 
Debug Single-Threaded 单线程静态链接库(debug版本) 
Debug Multithreaded 多线程静态链接库(debug版本) 
Debug Multithreaded DLL 多线程动态链接库(debug版本) 
单线程: 不需要多线程调用时, 多用在DOS环境下 
多线程: 可以并发运行 
静态库: 直接将库与程序Link, 可以脱离MFC库运行 
动态库: 需要相应的DLL动态库, 程序才能运行 
release版本: 正式发布时使用 

debug版本: 调试阶段使用


5.

解决VS2010升级SP1后出现的warning C4005问题

 一些程序在使用VS2010时编译一切正常,前几天升级了VS2010的SP1,结果发现原先正常的程序报错了,错误信息如下:      
        3>c:\program files (x86)\microsoft visual studio 10.0\vc\include\stdint.h(76): warning C4005: 'INT8_MAX' : macro redefinition
        3>          c:\program files (x86)\microsoft sdks\windows\v7.0a\include\intsafe.h(167) : see previous definition of 'INT8_MAX'
        ......

        一堆类似以上的错误信息。当然,考虑到代码质量问题,我一向是设置了警告也作为错误处理,所以出现如上警告后,程序编译失败。

        至少从目前来看,是升级SP1后造成一些宏定义重复定义导致(包含头文件顺序不当造成),解决方式如下:

        #ifdef _MSC_VER
        #pragma warning (push)
        #pragma warning (disable : 4005)
        #include <intsafe.h>
        #include <stdint.h>
        #pragma warning (pop)
        #pragma warning (default : 4005)
        #endif
        将以上代码放在代码统一访问的头文件中即可。

经过查资料发现这是一个VS2010 SP1的Bug问题,相关解释如下:

This issue I run into is that in mfc/atl there is an inclusion of afxglobals.h which in turns includes the wincodec.h file from the SDK.  This head file in turn includes intsafe.h from the SDK... So far no problem. However, we also have inclusion of stdint.h from VC2010. THis results in warnings .


原创粉丝点击