链接器工具警告 LNK4098

默认库“library”与其他库的使用冲突;请使用 /NODEFAULTLIB:library

你正在尝试链接到不兼容的库。

注意

运行时库现在包含阻止混合不同类型的指令。 如果尝试在同一程序中使用不同类型或调试和非调试版本的运行时库,将收到此警告。 例如,如果将一个文件编译为使用一种运行时库,另一个文件使用另一种(例如调试与零售),并尝试链接它们,则会收到此警告。 应编译所有源文件以使用相同的运行时库。 有关详细信息,请参阅 /MD、/MT、/LD(使用运行时库)编译器选项。

可以使用链接器的 /VERBOSE:LIB 开关找出链接器搜索哪些库。 例如,当可执行文件使用多线程的非调试运行时库时,报告的列表应包括 LIBCMT.lib,而不是 LIBCMTD.lib、MSVCRT.lib 或 MSVCRTD.lib。 可以通过对要忽略的每个库使用 /NODEFAULTLIB 告知链接器忽略不正确的运行时库。

下表显示了应忽略哪些库,具体取决于要使用的运行时库。 在命令行上,对每个库使用一个 /NODEFAULTLIB 选项来忽略。 在 Visual Studio IDE 中,用“忽略特定默认库”属性中的分号分隔要忽略的库。

使用此运行时库 忽略这些库
多线程 (libcmt.lib) msvcrt.lib; libcmtd.lib; msvcrtd.lib
使用 DLL (msvcrt.lib) 进行多线程处理 libcmt.lib; libcmtd.lib; msvcrtd.lib
Debug Multithreaded (libcmtd.lib) libcmt.lib; msvcrt.lib; msvcrtd.lib
Debug Multithreaded using DLL (msvcrtd.lib) libcmt.lib; msvcrt.lib; libcmtd.lib

例如,如果收到此警告,并且想要创建使用非调试 DLL 版本的运行时库的可执行文件,则可以将以下选项用于链接器:

/NODEFAULTLIB:libcmt.lib /NODEFAULTLIB:libcmtd.lib /NODEFAULTLIB:msvcrtd.lib