【问题标题】:visual studio linker warning LNK4098Visual Studio 链接器警告 LNK4098
【发布时间】:2011-05-19 02:35:25
【问题描述】:

我有一个 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:

我在发布配置中也有同样的情况,主要是因为我没有“明确”指定。因此,我在 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 预处理器定义,将其删除,它现在工作正常。

感谢大家的帮助!!

【问题讨论】:

    标签: c++ linker-warning


    【解决方案1】:

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

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

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

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

    【讨论】:

    • MSVCRT 已经是动态版本。您仍然必须链接到此,尽管它是通过导出库。 msdn.microsoft.com/en-us/library/abx4dbyh(v=VS.100).aspx
    • 对不起,我的错。你当然是对的。不过,其余的答案应该仍然是正确的。
    • 嗯,我检查了两个配置,在 Debuggug -> Multi-threaded Debug DLL (/MDd) 和 Release -> Multi-threaded DLL (/MD),但我仍然收到警告,我必须使用 /NODEFAULTLIB:MSVCRTD.LIB 进行发布配置吗?
    • 不,你不应该使用 nodefaultlib。查看您正在链接的所有外部库。其中至少有一个会引入冲突的运行时。
    • 您好,除了一些特定于 boost 的库之外,我没有使用任何外部库。我已经更改了两种配置:Debug 和 Release 指向同一个库:MSVCRT.LIB,现在我没有收到警告。我现在唯一的问题是……我可以在需要时进行调试吗?
    【解决方案2】:

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

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

    【讨论】:

    • 我使用的唯一需要 lib 链接的 boost 库是文件系统,它有两个版本:
    • 忘记最后一条评论:我使用的唯一需要 lib 链接的 boost 库是文件系统,它有两个版本:boost_filesystem-vc100-mt-gd-1_44.lib、boost_filesystem-vc100- mt-1_44.lib。我猜第一个是用于多线程调试的,第二个是 mt.我从来没有在我的链接器选项中指定选择哪个,它是“自动”的......这可能是问题的根源吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-07
    • 1970-01-01
    • 1970-01-01
    • 2011-02-10
    • 2011-08-31
    • 1970-01-01
    • 2017-12-09
    相关资源
    最近更新 更多