10

我有一个简单的测试文件 TestMe.cpp:

#include <gtest/gtest.h>

TEST(MyTest, SomeTest) {
  EXPECT_EQ(1, 1);
}

int main(int argc, char **argv) {
  ::testing::InitGoogleTest(&argc, argv);
  return RUN_ALL_TESTS();
}

我将 Google Test 构建为静态库。(如果相关,我可以提供makefile。)

我可以毫无问题地从命令行编译 TestMe.cpp:

g++ TestMe.cpp -IC:\gtest-1.5.0\gtest-1.5.0\include -L../gtest/staticlib -lgtest -o TestMe.exe

它按预期运行。

但是,我无法在 Qt 中编译它。我的 Qt 项目文件,在同一目录中:

SOURCES += TestMe.cpp
INCLUDEPATH += C:\gtest-1.5.0\gtest-1.5.0\include
LIBS += -L../gtest/staticlib -lgtest

这会导致 17 个与 gtest 函数相关的“未解析的外部符号”错误。

我在这里拉头发,因为我确信这很简单。有任何想法吗?

以下是一些未定义的外部符号:

TestMe.obj:-1: error:  unresolved external symbol "public: int __thiscall testing::UnitTest::Run(void)" (?Run@UnitTest@testing@@QAEHXZ) referenced in function _main
TestMe.obj:-1: error:  unresolved external symbol "public: static class testing::UnitTest * __cdecl testing::UnitTest::GetInstance(void)" (?GetInstance@UnitTest@testing@@SAPAV12@XZ) referenced in function _main
TestMe.obj:-1: error:  unresolved external symbol "void __cdecl testing::InitGoogleTest(int *,char * *)" (?InitGoogleTest@testing@@YAXPAHPAPAD@Z) referenced in function _main
TestMe.obj:-1: error:  unresolved external symbol "public: __thiscall testing::internal::AssertHelper::~AssertHelper(void)" (??1AssertHelper@internal@testing@@QAE@XZ) referenced in function "private: virtual void __thiscall MyTest_SomeTest_Test::TestBody(void)" (?TestBody@MyTest_SomeTest_Test@@EAEXXZ)
4

3 回答 3

7

我永远无法让它作为一个静态库工作,但它作为一个 DLL 工作。

首先,我必须将 Google Test 构建为 DLL。我没有成功让它在 Visual Studio 中工作,所以我只使用了 mingw32-make。您可以使用源中提供的 Makefile,进行以下更改:

gtest-all.o : $(GTEST_SRCS_)
    $(CXX) $(CPPFLAGS) -DGTEST_CREATE_SHARED_LIBRARY=1 -I$(GTEST_DIR) $(CXXFLAGS) -c \
            $(GTEST_DIR)/src/gtest-all.cc

gtest_main.o : $(GTEST_SRCS_)
    $(CXX) $(CPPFLAGS) -DGTEST_CREATE_SHARED_LIBRARY=1 -I$(GTEST_DIR) $(CXXFLAGS) -c \
            $(GTEST_DIR)/src/gtest_main.cc

gtest.dll : gtest-all.o
    $(CXX) -shared -o $@ $^ -Wl,--out-implib,gtest_dll.lib

gtest_main.dll : gtest-all.o gtest_main.o
    $(CXX) -shared -o $@ $^ -Wl,--out-implib,gtest_main_dll.lib

然后,在编译测试项目时,您必须:

  • 定义 GTEST_LINKED_AS_SHARED_LIBRARY=1
  • 设置对 gtest_dll.lib 或 gtest_main_dll.lib 的库引用。
  • 将 gtest.dll 或 gtest_main.dll 粘贴到与可执行文件相同的目录中。

(我的理解是,只有在不提供自己的 main() 函数时才使用 gtest_main。)

这是一个基于我拥有的示例 Qt pro 文件(终于!)工作:

DEFINES += GTEST_LINKED_AS_SHARED_LIBRARY=1
SOURCES += main.cpp MyClassTests.cpp
INCLUDEPATH += ../path/to/gtest/includes
LIBS += -L../path/to/gtest/libraries -lgtest_dll \
    -L../ClassLibrary/bin -lMyClass
CONFIG += console
于 2010-05-07T20:24:15.527 回答
3

我正在使用 Qt + gtest/gmock 没有任何问题。我刚刚测试了具有不同斜杠的绝对/相对路径的所有可能组合,但我无法重现您的问题。您是否检查过 qmake 生成的 Makefile.Debug 中“LIBS”变量的内容?

这是一些通用的建议:不要使用任何绝对路径,因为您的代码不会在您自己的机器上编译,除非您将其下载到完全相同的位置(由于 Qt 设置不同,这可能是不可能的, ETC。)。改为使用相对路径,也适用于 3rd 方库。

我将第 3 方库保存在版本控制系统中(您使用一个,对吗?)。我有一个“3rdparty”目录,对于每个使用这些库的项目,我添加了指向明确指定版本的 3rd 方库的 svn:external 属性。最后一部分很重要,因为它确保您能够构建项目的每个修订版,即使您更新了 3rd 方库。

于 2010-05-06T19:17:22.323 回答
0

我认为你的 qmake 文件没问题。但是为什么 INCLUDEPATH 是绝对的,而 LIBS 是相对的。我也会尝试设置 LIBS absolute。

从这里 http://doc.trolltech.com/4.6/qmake-variable-reference.html#includepath

但主要问题是(我认为)你需要在 INCLUDEPATH 中提出斜线。在文档中是这样的。

INCLUDEPATH += C:/gtest-1.5.0/gtest-1.5.0/include
于 2010-05-06T18:45:06.253 回答