我有一个大而复杂的项目,它最终得到了单元测试。我用Visual Studio 2010在本地构建了googleTest 1.6.0,项目文件用cmake构建,如README指定。
该项目有许多静态和动态链接的依赖库。其中许多是专有的。所有链接尝试都会产生220个这样的错误。以下是一个示例:
msvcprtd.lib(msvcp100 .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): error LNK2005: _configthreadlocale已经在MSVCRTD.lib(MSVCR100D.dll)中定义
链接:警告LNK4098: defaultlib 'MSVCRTD'与使用其他库冲突;使用/NODEFAULTLIB:图书馆链接:警告LNK4098: defaultlib 'LIBCMTD'与其他库的使用冲突;使用/NODEFAULTLIB:库
致命错误LNK1169:找到一个或多个乘法定义的符号
我试过/NODEFAULTLIB标志,我试过忽略msvcprtd。自由,MSVCRTD。lib和LIBCMTD。如建议的那样,lib,但随后我遭受了无法解决的符号…
项目和googleTest都是用x64,/MP,/MDd,而不是/clr编译的。
我一直在摆弄编译器标志,想知道是否有某种版本不匹配。就我所理解的而言,"垃圾箱"并没有暗示任何我可能理解的东西。
看起来你的问题在Google Talk的常见问题解答中得到了答案。确保所有库都使用/MD(d)设置。
如果您试图将您的测试项目与Google test库链接,而您的项目和Google test库不是使用相同的编译器设置构建的,那么您可能会得到以下一些链接器错误或警告。
- LNK2005:符号已经在对象
中定义- LNK4217:在函数'function'中导入本地定义符号'symbol'
- LNK4049:导入本地定义符号'symbol'Google测试项目(gtest.vcproj)将运行时库选项设置为/MT(使用多线程静态库,/MTd用于调试)。如果您的项目使用其他东西,例如/MD(使用多线程dll,/MDd用于调试),您需要更改Google Test项目中的设置以匹配您的项目。
要更新此设置,请在Visual Studio IDE中打开项目属性,然后选择分支Configuration properties | C/c++ | Code Generation,并更改选项"Runtime Library"。您也可以尝试使用gtest-md。gtest.vcproj.