Используйте Google Test из Qt в Windows - PullRequest
9 голосов
/ 06 мая 2010

У меня есть простой тестовый файл, 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, созданный как статическая библиотека. (Я могу предоставить make-файл, если он уместен.)

Я могу без проблем скомпилировать 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)

Ответы [ 3 ]

7 голосов
/ 08 мая 2010

Я никогда не мог заставить это работать как статическая библиотека, но она работает как 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 в тот же каталог, что и ваш исполняемый файл.

(Насколько я понимаю, вы используете gtest_main, только если вы НЕ предоставляете свою собственную функцию 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
3 голосов
/ 06 мая 2010

Я использую Qt + gtest / gmock без проблем. Я только что проверил все возможные комбинации абсолютных / относительных путей с разными косыми чертами, но я не смог воспроизвести вашу проблему. Вы проверили содержимое переменной "LIBS" из Makefile.Debug, сгенерированного qmake?

Вот несколько общих советов: не используйте абсолютные пути, потому что ваш код не будет компилироваться на других машинах, кроме ваших, если вы не загрузите его в точно такое же место (что может быть невозможно из-за различные настройки Qt и т. д.). Вместо этого используйте относительные пути, также для сторонних библиотек.

Я храню сторонние библиотеки в системе контроля версий (вы используете одну, верно?). У меня есть каталог "3rdparty", и для каждого проекта, который использует эти библиотеки, я добавляю свойство svn: external, указывающее на явно указанную версию сторонней библиотеки. Последняя часть важна, потому что она гарантирует, что вы сможете создавать каждую ревизию вашего проекта, даже когда вы обновляете стороннюю библиотеку.

0 голосов
/ 06 мая 2010

Я думаю, что вы в порядке с вашим файлом qmake. Но почему ВКЛЮЧЕНО в абсолютное значение и относительно LIBS. Я бы также попытался установить абсолютную LIBS.

Отсюда http://doc.trolltech.com/4.6/qmake-variable-reference.html#includepath

Но в чем заключается главная проблема (я думаю), вам нужно добавить косую черту в INCLUDEPATH. В документах это так.

INCLUDEPATH += C:/gtest-1.5.0/gtest-1.5.0/include
...