Используйте Google Test из Qt в Windows

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

Я могу скомпилировать TestMe.cpp из командной строки без проблем:

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

Он работает, как ожидалось.

однако я не могу получить это для компиляции в Qt. Мой файл проекта Qt, в том же каталоге:

SOURCES += TestMe.cpp
INCLUDEPATH += C:gtest-1.5.0gtest-1.5.0include
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 ответов


Я никогда не мог заставить это работать как статическая библиотека, но он работает как DLL.

во-первых, мне пришлось построить тест Google как 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.движение за освобождение.
  • вставить 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

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

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

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


Я думаю, что вы в порядке для вашего файла 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