是的,我知道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ü