LIBCMT.lib:错误LNK2001:未解析的外部符号_main

LIBCMT.lib: error LNK2001: unresolved external symbol _main

本文关键字:外部 符号 main lib 错误 LNK2001 LIBCMT      更新时间:2023-10-16

是的,我知道Stackoverflow上已经有数百篇关于LNK2001的帖子了。但没有一个能解决我的问题。所以我在这里发布了我的解决方案。

症状:ATL DLL编译为Debug很好,但由于以上错误编译为Release而失败。

在互联网上搜索了一个小时,发现了一些没有提示的信息,比如"你定义了main()函数吗?"我想我必须发布我特定问题的解决方案。

重要:LNK2001可能有数百万个原因!

如果我的解决方案对您的具体情况没有帮助,并且本页也没有:http://msdn.microsoft.com/en-us/library/f6xx1b1z%28v=vs.71%29.aspx

然后要注意在搜索中包含尽可能多的关键字。就像我的案例"LIBCMT.lib LNK2001 _main"一样。这对于避免淹没在数以百万计的搜索结果中至关重要。

LIBCMT.LIB定义了memcpy、swprintf等函数,它们是CRT函数。(C运行库)

我在我的项目中使用了其中的一些函数。那么,为什么Debug版本构建而Release版本不构建呢?

原因是CRT库需要初始化,它有一个启动代码,必须调用一次(通常在_main期间)

如果项目定义_ATL_MIN_CRT,则CRT启动代码将从Release版本中的Exe、Dll中排除,以减小文件大小。

知道这一点,解决方案很简单:

解决方案A)从项目设置中删除_ATL_MIN_CRT

解决方案B)在文件Stdafx.h的末尾放一行:

#undef _ATL_MIN_CRT

这解决了问题。

当我在其他项目中重复使用我的课程时,我把它放在了课程的开头:

#ifdef _ATL_MIN_CRT
    #error _ATL_MIN_CRT is not valid for this project
#endif

这确保了将来在另一个项目中重用我的代码,我会立即收到警告。

Elmü