由于其他依赖库,在 VS2010 中链接 googleTest 会导致 LNK2005
Posted
技术标签:
【中文标题】由于其他依赖库,在 VS2010 中链接 googleTest 会导致 LNK2005【英文标题】:Linking googleTest in VS2010 results in LNK2005 because of other dependent libraries 【发布时间】:2011-09-19 20:28:10 【问题描述】:我有一个大型而复杂的项目,最终要进行单元测试。我已经在本地使用 Visual Studio 2010 构建了 googleTest 1.6.0,项目文件按照 README 的规定使用 cmake 构建。
这个项目有许多静态和动态链接的依赖库。其中许多是专有的。所有链接尝试都会产生 220 个此类错误。这是一个示例:
msvcprtd.lib(MSVCP100D.dll) : error LNK2005: "public: void __cdecl std::_Container_base12::_Orphan_all(void)" (?_Orphan_all@_Container_base12@std@@QEAAXXZ) 已经在 gtest.lib(gtest -all.obj)
libcpmtd.lib(cerr.obj) : error LNK2005: "protected: char * __cdecl std::basic_streambuf >::_Gndec(void)" (?_Gndec@?$basic_streambuf@DU?$char_traits@D@std@ @@std@@IEAAPEADXZ) 已在 msvcprtd.lib(MSVCP100D.dll) 中定义
LIBCMTD.lib(setlocal.obj) : 错误 LNK2005: _configthreadlocale 已在 MSVCRTD.lib(MSVCR100D.dll) 中定义
LINK:警告 LNK4098:defaultlib 'MSVCRTD' 与其他库的使用冲突;使用 /NODEFAULTLIB:library 链接:警告 LNK4098:defaultlib 'LIBCMTD' 与使用其他库冲突;使用 /NODEFAULTLIB:library
致命错误 LNK1169:找到一个或多个多重定义符号
我已经尝试了 /NODEFAULTLIB 标志,并且我尝试按照建议只忽略 msvcprtd.lib、MSVCRTD.lib 和 LIBCMTD.lib,但是我遇到了无法解析的符号...
项目和 googleTest 都使用 x64、/MP、/MDd 编译,没有 /clr。
我一直在玩编译器标志,想知道是否存在某种版本不匹配。 Dumpbin,就我的理解而言,并没有暗示我可能理解的任何事情。我希望有一个呃
【问题讨论】:
【参考方案1】:您的问题似乎已在 Google Talk 的FAQ 中得到解答。确保所有库都使用 /MD(d) 设置。
如果您尝试将您的测试项目与 Google 测试库链接,而您的项目和未使用相同的编译器设置构建,您可能会收到以下许多链接器错误或警告。
LNK2005:符号已在对象中定义 LNK4217:在函数“function”中导入的本地定义符号“symbol” LNK4049:已导入本地定义的符号“符号” Google 测试项目 (gtest.vcproj) 将运行时库选项设置为 /MT(使用多线程静态库,/MTd 进行调试)。如果您的项目使用其他内容,例如 /MD(使用多线程 DLL,/MDd 进行调试),您需要更改 Google 测试项目中的设置以匹配您的项目。要更新此设置,请在 Visual Studio IDE 中打开项目属性,然后选择分支配置属性 | C/C++ |代码生成并更改选项“运行时库”。您也可以尝试使用 gtest-md.vcproj 而不是 gtest.vcproj。
【讨论】:
事实证明你是对的。在我通过自己的试验偶然发现答案之前,我忘记了我已经发布了这个问题。 虽然已经有好几年了,你能否修复(现在)不正确的常见问题解答链接:github.com/google/googletest/blob/master/googletest/docs/…以上是关于由于其他依赖库,在 VS2010 中链接 googleTest 会导致 LNK2005的主要内容,如果未能解决你的问题,请参考以下文章
与 CMake 和 Visual Studio 2010 的链接错误
MyElipse6.5环境下java调用vs2010动态链接库DLL人脸检测
MyElipse6.5环境下java调用vs2010动态链接库DLL人脸检测