由于其他依赖库,在VS2010中链接googleTest会导致LNK2005

Mat*_*ton 7 linker-errors googletest visual-studio-2010 lnk2005

我有一个庞大而复杂的项目,最终得到了单元测试.我已经在Visual Studio 2010本地构建了googleTest 1.6.0,使用cmake构建的项目文件就像README指定的那样.

该项目有许多静态和动态链接的依赖库.其中许多是专有的.所有链接尝试都会产生220个这样的错误.这是一个抽样:

msvcprtd.lib(MSVCP100D.dll):错误LNK2005:"public:void __cdecl std :: _ Container_base12 :: _ Orphan_all(void)"(?_ Olphan_all @ _Container_base12 @std @@ QEAAXXZ)已在gtest.lib中定义(gtest-all. OBJ)

libcpmtd.lib(cerr.obj):错误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:已在MSVCRTD.lib中定义_configthreadlocale(MSVCR100D.dll)

链接:警告LNK4098:defaultlib'MSVCRTD'与使用其他库冲突; use/NODEFAULTLIB:library LINK:警告LNK4098:defaultlib'LIBCMTD'与使用其他库冲突; 使用/ NODEFAULTLIB:库

致命错误LNK1169:找到一个或多个多重定义的符号

我已经尝试了/ NODEFAULTLIB标志,并且我试图忽略msvcprtd.lib,MSVCRTD.lib和LIBCMTD.lib,如建议的那样,但后来我遇到了未解决的符号......

项目和googleTest都使用x64,/ MP,/ MDd和no/clr进行编译.

我一直在玩编译器标志,想知道是否存在某种版本不匹配.在我理解的范围内,Dumpbin没有暗示我可能理解的任何东西.我希望有一个呃

Vla*_*sev 12

看起来您的问题已在Google Talk的常见问题解答中得到解答.确保所有库都使用/ MD(d)设置.

如果在项目中使用相同的编译器设置构建项目时尝试将测试项目与Google Test库链接,则可能会收到以下链接器错误或警告.

  • LNK2005:已在对象中定义的符号
  • LNK4217:在函数'function'中导入的本地定义的符号'symbol'
  • LNK4049:已导入本地定义的符号"符号"Google Test项目(gtest.vcproj)将运行时库选项设置为/ MT(使用多线程静态库,/ MTd用于调试).如果您的项目使用其他内容,例如/ MD(使用多线程DLL,/ MDd进行调试),则需要更改Google Test项目中的设置以匹配您的项目.

要更新此设置,请在Visual Studio IDE中打开项目属性,然后选择分支Configuration Properties | C/C++ | 代码生成并更改选项"运行时库".您也可以尝试使用gtest-md.vcproj而不是gtest.vcproj.