我有一个庞大而复杂的项目,最终将进行单元测试。我已经使用Visual Studio 2010在本地构建了googleTest 1.6.0,该项目文件是使用README指定的cmake构建的。

该项目具有许多静态和动态链接的从属库。其中许多是专有的。所有的链接尝试都会产生220个此类错误。这是一个样本:


  
    
      msvcprtd.lib(MSVCP100D.dll):错误LNK2005:“公共:void __cdecl std :: _ Container_base12 :: _ Orphan_all(void)”(?_Orphan_all @ _Container_base12 @ std @@ QEAAXXZ)已在gtest.lib(gtest-all。)中定义。 obj)
      
      libcpmtd.lib(cerr.obj):错误LNK2005:“保护:char * __cdecl std :: basic_streambuf> :: _ Gndec(void)”(?_ Gndec @?$ basic_streambuf @ DU?$ char_traits @ D @ std @@@ std msvcprtd.lib(MSVCP100D.dll)中已定义的@@ IEAAPEADXZ
      
      LIBCMTD.lib(setlocal.obj):错误LNK2005:MSVCRTD.lib(MSVCR100D.dll)中已定义的_configthreadlocale
      
      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并没有暗示我可能理解的任何内容。我希望有一个

最佳答案

您的问题似乎已在Google Talk的FAQ中得到了回答。确保所有库都使用/ MD(d)设置。


  如果在未使用相同的编译器设置构建项目时,尝试将测试项目与Google Test库链接,可能会收到以下链接器错误或警告。
  
  
  LNK2005:对象中已定义符号
  LNK4217:在函数“功能”中导入了本地定义的符号“符号”
  LNK4049:导入了本地定义的符号“ symbol”
  Google Test项目(gtest.vcproj)的“运行时库”选项设置为/ MT(使用多线程静态库,/ MTd进行调试)。如果您的项目使用其他内容,例如/ MD(使用多线程DLL,/ MDd进行调试),则需要更改Google Test项目中的设置以匹配您的项目。
  
  
  要更新此设置,请在Visual Studio IDE中打开项目属性,然后选择分支。 C / C ++ |代码生成并更改选项“运行时库”。您也可以尝试使用gtest-md.vcproj代替gtest.vcproj。

关于visual-studio-2010 - 由于存在其他依赖库,因此在VS2010中链接googleTest导致LNK2005,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15993912/

10-12 07:35
查看更多