Visual c++ MSVC/VS2012中存在冲突的运行库

Visual c++ MSVC/VS2012中存在冲突的运行库,visual-c++,linker,msvcrt,glew,Visual C++,Linker,Msvcrt,Glew,我知道:,但在尽可能多地阅读了有关这方面的内容后,我仍然无法找出为什么我无法修复它,或者甚至无法修复什么 根据,您可以看到,如果您的项目同时使用两个不同的标准运行时库进行编译,则会出现问题。其中最常见的是libcmt.lib和msvcrt.lib,以及它们的调试等价物 显然,我的项目同时使用了这两种方法,因此出现了以下警告: 1>LINK : warning LNK4098: defaultlib 'LIBCMT' conflicts with use of other libs; use

我知道:,但在尽可能多地阅读了有关这方面的内容后,我仍然无法找出为什么我无法修复它,或者甚至无法修复什么

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

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

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,这一事实让我怀疑当前构建中是否存在任何配置问题。我不使用MFC或ATL或任何其他Visual C++库,除了它们的原生STL实现。

首先,我要说的是,我已经尝试将项目的属性从
多线程[Debug]DLL
设置为
多线程[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 < /COD>,即<代码> MVCRT.LIB < /C> > /P> 调试生成输入

/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" 

我怎样才能解决这个问题?非常感谢您的帮助。

您将使用/MD(使用CRT的DLL版本)编译的代码与使用/MT(使用静态CRT库)编译的代码混合使用。这无法工作,所有源代码文件必须使用相同的设置编译。假设您使用的库是使用/MD预编译的,几乎总是正确的设置,那么您也必须使用此设置编译自己的代码

项目+属性,C/C++,代码生成,运行库

请注意,这些库可能是使用早期版本的CRT编译的,msvcr100.dll是非常新的。不确定这是否会导致问题,您可能必须阻止链接器生成清单。您还必须确保将所需的dll部署到目标计算机,包括msvcr100.dll

有一个相同的问题:

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