3

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

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

在互联网上搜索了一个小时,发现诸如“您是否定义了 main() 函数?”之类的无用提示。我认为我必须针对我的具体问题发布解决方案。

4

1 回答 1

1

重要提示: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

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

埃尔穆

于 2015-01-29T15:54:07.403 回答