我有一个 dll 项目,在发布配置中构建该项目时,我收到以下警告:
MSVCRT.lib(cinitexe.obj):警告
LNK4098:默认库“msvcrtd.lib”
与其他库的使用冲突;使用
/NODEFAULTLIB:库
这只是一个警告,但我不知道是否应该考虑这一点。
据我所知,它们都是多线程库、普通版本和调试版本。我的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:
我在发布配置中也有相同的配置,主要是因为我没有“明确”指定。因此,我在发布中将它们更改为:
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 预处理器定义,将其删除,现在它工作得很好。
谢谢大家的帮助!!
如果您仔细阅读,它会在消息中指出问题所在:
“MSVCRT.lib”与“msvcrtd.lib”
请注意第二个库名称中添加的“d”。发生的情况是,您静态链接到 Visual Studio C++ 运行时 (MSVCRT)。您的一个库正在提取该库的发行版本,而另一个库正在提取调试版本(因此后缀“d”)。链接器告诉您两个库定义的函数具有相同的名称,存在冲突,因此其中一个会自动删除。
要解决此问题,请检查所有项目/库的构建设置,并确保它们对所有构建配置使用相同的运行时库。在看project properties
-> C/C++
-> Code Generation
-> Runtime Library
。对于发布版本,这可能应该是“多线程”,对于调试版本,应该是“多线程调试”。
请注意,静态链接这些库通常被认为是不好的做法,您应该更喜欢动态链接的 dll 版本。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)