本文共 1751 字,大约阅读时间需要 5 分钟。
在创建MFC项目时,如果没有设置好项目参数,编译时可能会出现许多连接错误。今天遇到的一种常见错误是:
LIBCD.lib(crt0.obj) : error LNK2001: unresolved external symbol _main
这种错误通常发生在一个项目未正确设置子系统类型时。具体来说,控制台项目需要使用Windows子系统,而不是Console。要进行设置:
/subsystem:console
修改为 /subsystem:windows
。但有时候实际情况相反,可能会遇到类似的另一类错误:
LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol _WinMain@16
这种情况下,正确的解决方法是将【Link】属性页的 /subsystem:windows
切换为 /subsystem:console
。
这类错误的根本原因在于新建工程时没有正确区分 Win32 Application 和 Win32 Console Application。两者都是在32位 Windows 环境中运行的程序,但它们的本质区别在于入口函数:
WinMain
作为入口函数。main
作为入口函数。这里的关键是理解 Win32 Application 是默认的选择,而传统的 C 程序需要选择 Win32 Console Application 才能正常编译。VC++ 中默认设置会导致链接错误,需要在【Link】属性页正确设置子系统类型,才能避免上述错误。
此外,还有其他常见的 LNK2001 错误需要注意:
缺少 main 入口:
libcmtd.lib(crt0.obj) : error LNK2001: unresolved external symbol _main
这提示需要在【C/C++】属性页的【Output】选项卡中,将入口符号设置为 main
或借助 VC++ 项目解释机制正确识别。
MFC 项目入口设置错误:
msvcrtd.lib(crtexew.obj) : error LNK2001: unresolved external symbol _WinMain@16
MFC 项目的默认入口函数是 WinMain
,但在编译 Unicode 版本时,这个入口需要重命名为 wWinMainCRTStartup
。可以参考【C/C++】属性页的【Output】选项卡,按照需要设置入口符号。
线程运行时库设置错误:
nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __beginthreadexnafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __endthreadex
这表明需要正确设置多线程运行时库。在【C/C++】属性页选择【Code Generation】,检查是否需要 Debug Multithreaded 或 multithreaded DL[2],以支持线程安全应用开发。
在项目设置过程中,请务必注意以下几点,避免类似错误的发生:
尤其是对于需要调用标准 C 库函数(如 sleep()
或 printf()
)的项目,确保线程安全库设置正确,可以选择 Debug 选项以获得更好的调试体验。
总之,理解项目类型、入口函数以及必须调用的运行时库设置,是避免上述错误的关键。希望这些信息能帮助开发者更好地配置项目参数,顺利进行 MFC 应用程序的开发。
这篇文章转载自 Cao的博客,中文版有微小改动,仅用于分享和学习。