5

我有一个 dll 项目,在发布配置中构建项目时,我收到以下警告:

MSVCRT.lib(cinitexe.obj):警告 LNK4098:defaultlib 'msvcrtd.lib' 与其他库的使用冲突;使用 /NODEFAULTLIB:library

这只是一个警告,但我不知道是否应该考虑到这一点。

根据我的发现,它们都是多线程库、正常版本和调试版本。我的 dll 使用多线程,我可以调试它,虽然我使用 boost:thread ,所以我真的不知道我是否需要这个 Windows 特定的库来调试或发布构建......

亲切的问候,亚历克斯

好吧,我按照 BuschnicK 的建议做了,并使用 /VERBOSE:LIB 链接器标志发现我在调试配置中链接到这些库:

boost_filesystem-vc100-mt-gd-1_44.lib:libboost_system-vc100-mt-gd-1_44.lib:libboost_thread-vc100-mt-gd-1_44.lib:libboost_date_time-vc100-mt-gd-1_44.lib:

我在发布配置中也有同样的情况,主要是因为我没有“明确地”指定。因此,我在 Release 中将它们更改为:

boost_filesystem-vc100-mt-1_44.lib: libboost_system-vc100-mt-1_44.lib: libboost_thread-vc100-mt-1_44.lib: libboost_date_time-vc100-mt-1_44.lib:

这似乎有效,但我仍然收到第一个警告,直到我意识到我的发布配置中也有 _DEBUG 预处理器定义,删除它并且它现在工作正常。

谢谢大家的帮助!!

4

2 回答 2

10

如果您仔细阅读,它会在消息中说明问题所在:“MSVCRT.lib”与“msvcrtd.lib”

注意第二个库名称中添加的“d”。发生的情况是您静态链接到 Visual Studio C++ 运行时 (MSVCRT)。您的一个库正在拉取该库的发布版本,而另一个库正在拉取调试版本(因此后缀“d”)。链接器告诉您,两个库都定义了同名的函数,它们存在冲突,因此其中一个会被自动删除。

要解决此问题,请检查所有项目/库的构建设置,并确保它们对所有构建配置使用相同的运行时库。查看project properties-> C/C++-> Code Generation-> Runtime Library。对于发布版本,这可能应该读为“多线程”,对于调试版本,应该读为“多线程调试”。

请注意,静态链接这些库通常被认为是不好的做法,您应该更喜欢动态链接的 dll 版本。

于 2010-12-02T12:31:27.717 回答
7

听起来您可以在同一个版本中运行调试库和发布编译库。

浏览您的项目选项并选择使用您使用的任何 3rd 方库的调试版本。

于 2010-12-02T14:10:38.190 回答