是的,我知道 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 启动代码从 Exe 中排除,在 Release 构建中的 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
这确保了将来在另一个项目中重用我的代码时,我会立即收到警告。
埃尔穆