7

我有一个庞大而复杂的项目,终于要进行单元测试了。我已经使用 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) : 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) 中定义

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

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

我已经尝试了 /NODEFAULTLIB 标志,并且按照建议尝试仅忽略 msvcprtd.lib、MSVCRTD.lib 和 LIBCMTD.lib,但后来我遇到了未解析的符号...

项目和 googleTest 都使用 x64、/MP、/MDd 编译,没有 /clr。

我一直在玩编译器标志,想知道是否存在某种版本不匹配。Dumpbin,就我的理解而言,并没有暗示我可能理解的任何事情。我希望有一个呃

4

1 回答 1

12

看起来您的问题已在 Google Talk 的常见问题解答中得到解答。确保所有库都使用 /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。

于 2011-09-22T08:16:58.667 回答