【问题标题】:Conflicting Runtime Libraries in MSVC/VS2012MSVC/VS2012 中的冲突运行时库
【发布时间】:2012-10-17 16:15:54
【问题描述】:

我知道:this has already been addressed,但是在阅读了尽可能多的内容后,我仍然无法弄清楚为什么我无法修复它,或者 什么甚至修复。

您看,根据this,如果您的项目同时使用两个不同的标准运行时库进行编译,将会出现问题。其中最常见的是 libcmt.libmsvcrt.lib,以及它们的调试等效项。

显然,我的项目使用 both 这两种方法,因此会同时出现以下警告:

1>LINK : warning LNK4098: defaultlib 'LIBCMT' conflicts with use of other libs; use /NODEFAULTLIB:library
1>LINK : warning LNK4098: defaultlib 'MSVCRT' conflicts with use of other libs; use /NODEFAULTLIB:library
1>glew32s.lib(glew.obj) : warning LNK4099: PDB 'vc100.pdb' was not found with 'glew32s.lib(glew.obj)' or at 'C:\Programming\VS\Play_VS\Debug\vc100.pdb'; linking object as if no debug info

如您所见,我为此使用了 glew。代码编译没有任何错误,但我使用的唯一外部库是 GLEW/GLFW/GLU/GLM 的事实让我想知道我当前的构建中是否存在任何配置问题.除了本机 STL 实现之外,我没有使用 MFC 或 ATL 或任何其他 Visual C++ 库。

首先,我要说我已经尝试将我的项目属性从Multi-Threaded [Debug] DLL 设置为Multi-Threaded [Debug],这似乎通过产生以下输出使事情变得更糟:

1>MSVCRT.lib(MSVCR110.dll) : error LNK2005: _free already defined in LIBCMTD.lib(dbgfree.obj)
1>MSVCRT.lib(MSVCR110.dll) : error LNK2005: _malloc already defined in LIBCMTD.lib(dbgmalloc.obj)
1>MSVCRT.lib(MSVCR110.dll) : error LNK2005: _fprintf already defined in LIBCMTD.lib(fprintf.obj)
1>MSVCRT.lib(MSVCR110.dll) : error LNK2005: ___iob_func already defined in LIBCMTD.lib(_file.obj)
1>MSVCRT.lib(MSVCR110.dll) : error LNK2005: _strchr already defined in LIBCMTD.lib(strchr.obj)
1>MSVCRT.lib(ti_inst.obj) : error LNK2005: "private: __thiscall type_info::type_info(class type_info const &)" (??0type_info@@AAE@ABV0@@Z) already defined in LIBCMTD.lib(typinfo.obj)
1>MSVCRT.lib(ti_inst.obj) : error LNK2005: "private: class type_info & __thiscall type_info::operator=(class type_info const &)" (??4type_info@@AAEAAV0@ABV0@@Z) already defined in LIBCMTD.lib(typinfo.obj)
1>LINK : warning LNK4098: defaultlib 'LIBCMT' conflicts with use of other libs; use /NODEFAULTLIB:library
1>LINK : warning LNK4098: defaultlib 'MSVCRT' conflicts with use of other libs; use /NODEFAULTLIB:library
1>C:\Programming\VS\Play_VS\Debug\Play_VS.exe : fatal error LNK1169: one or more multiply defined symbols found

同样,查看调试和发布版本的编译标志告诉我,/MT (libcmt.lib) 在任何一个命令生成输入中都不存在。据我所知,大多数在 Windows 中编写原生 C++ 应用程序的人都使用/MD,即msvcrt.lib

调试构建输入

/GS /analyze- /W3 /Zc:wchar_t /ZI /Gm /Od /Fd"Debug\vc110.pdb" /fp:precise /D "GLEW_STATIC" /D "_CRT_SECURE_NO_WARNINGS" /D "_MBCS" /errorReport:prompt /WX- /Zc:forScope /RTC1 /GR /Gd /Oy- /MDd /Fa"Debug\" /EHsc /nologo /Fo"Debug\" /Fp"Debug\Play_VS.pch" 

发布构建输入

/GS /GL /analyze- /W3 /Gy /Zc:wchar_t /Zi /Gm- /O2 /Fd"Release\vc110.pdb" /fp:precise /D "_CRT_SECURE_NO_WARNINGS" /D "_MBCS" /errorReport:prompt /WX- /Zc:forScope /Gd /Oy- /Oi /MD /Fa"Release\" /EHsc /nologo /Fo"Release\" /Fp"Release\Play_VS.pch" 

我该如何解决这个问题?感谢您的帮助。

【问题讨论】:

  • 你有一个过时的 glew 构建,你应该从源代码重建它。现在也是让构建设置达成一致的好方法。
  • 我遇到了完全相同的问题。对我来说,诀窍是重新编译所有内容。不要使用预编译的。

标签: visual-c++ linker msvcrt glew


【解决方案1】:

您正在混合使用 /MD(使用 CRT 的 DLL 版本)编译的代码和使用 /MT(使用静态 CRT 库)编译的代码。那行不通,所有源代码文件都必须使用相同的设置进行编译。鉴于您使用的是使用 /MD 预编译的库,几乎总是正确的设置,您也必须使用此设置编译您自己的代码。

项目 + 属性、C/C++、代码生成、运行时库。

请注意,这些库可能是使用早期版本的 CRT 编译的,msvcr100.dll 是相当新的。不确定这是否会引起麻烦,您可能必须阻止链接器生成清单。您还必须确保将所需的 DLL 部署到目标机器,包括 msvcr100.dll

同样的问题: error LNK2005: xxx already defined in MSVCRT.lib(MSVCR100.dll) C:\something\LIBCMT.lib(setlocal.obj)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-11
    • 1970-01-01
    • 2020-06-23
    • 1970-01-01
    • 1970-01-01
    • 2020-07-24
    • 2012-12-13
    • 1970-01-01
    相关资源
    最近更新 更多