我有一个庞大而复杂的项目终于进行了单元测试。我已经使用 Visual Studio 2010 在本地构建了 googleTest 1.6.0,项目文件按照 README 的指定使用 cmake 构建。
该项目有许多静态和动态链接的依赖库。其中许多是专有的。所有链接尝试都会生成 220 个此类错误。这是一个样本:
msvcprtd.lib(MSVCP100D.dll) : 错误 LNK2005: “public: void __cdecl std::_Container_base12::_Orphan_all(void)” (?_Orphan_all@_Container_base12@std@@QEAAXXZ) 已在 gtest.lib(gtest-all.对象)
libcpmtd.lib(cerr.obj) : 错误 LNK2005: “受保护: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) 中定义
链接:警告 LNK4098:defaultlib 'MSVCRTD' 与其他库的使用冲突;使用 /NODEFAULTLIB:库
链接:警告 LNK4098:defaultlib 'LIBCMTD' 与其他库的使用冲突;使用 /NODEFAULTLIB:库
致命错误 LNK1169:找到一个或多个多重定义的符号
我尝试过 /NODEFAULTLIB 标志,并且按照建议尝试忽略 msvcprtd.lib、MSVCRTD.lib 和 LIBCMTD.lib,但后来我遇到了无法解析的符号...
该项目和 googleTest 都是使用 x64、/MP、/MDd 编译的,并且没有 /clr。
我一直在研究编译器标志,想知道是否存在某种版本不匹配。就我的理解而言,Dumpbin 并没有暗示任何我可能理解的内容。我本来希望有一个呃
看来您的问题已在 Google Talk 中得到解答FAQ。确保所有库都使用 /MD(d) 设置。
如果您尝试将您的测试项目与 Google 测试库链接,但您的项目和 Google 测试库不是使用相同的编译器设置构建的,则可能会收到以下一些链接器错误或警告。
- LNK2005:符号已在对象中定义
- LNK4217:在函数“function”中导入本地定义的符号“symbol”
- LNK4049:导入本地定义的符号“symbol”
Google 测试项目 (gtest.vcproj) 将运行时库选项设置为 /MT(使用多线程静态库,/MTd 进行调试)。如果您的项目使用其他内容,例如 /MD(使用多线程 DLL,/MDd 用于调试),则需要更改 Google Test 项目中的设置以匹配您的项目。
要更新此设置,请在 Visual Studio IDE 中打开项目属性,然后选择分支配置属性| C/C++ |代码生成并更改选项“运行时库”。您也可以尝试使用 gtest-md.vcproj 而不是 gtest.vcproj。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)