是的,我知道在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定义了诸如CMC函数之类的函数memcpy,swprintf等。 (C运行时库)

我在项目中使用了其中一些功能。那么为什么要构建Debug版本而不能发布Release版本呢?

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

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

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

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

解决方案B)在文件Stdafx.h的末尾添加以下行:

#undef _ATL_MIN_CRT

那解决了问题。

当我在其他项目中重用我的类(class)时,我将在类(class)开始时输入:
#ifdef _ATL_MIN_CRT
    #error _ATL_MIN_CRT is not valid for this project
#endif

这样可以确保将来会在另一个项目中重复使用我的代码。

埃尔穆

关于c++ - LIBCMT.lib:错误LNK2001:无法解析的外部符号_main,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17371508/

10-11 00:49