Search code examples
qtgoogletest

Use Google Test from Qt in Windows


I have a simple test file, 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();
}

I have Google Test built as a static library. (I can provide the makefile if it's relevant.)

I can compile TestMe.cpp from a command-line with no problem:

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

It runs as expected.

However, I cannot get this to compile in Qt. My Qt project file, in the same directory:

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

This results in 17 "unresolved external symbol" errors related to gtest functions.

I'm pulling my hair out here, as I'm sure it's something simple. Any ideas?

Here are some of the external symbols that are undefined:

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)

Solution

  • I never could get this to work as a static library, but it's working as a DLL.

    First, I had to build Google Test as a DLL. I did not have any success getting this to work in Visual Studio, so I just used mingw32-make. You can use the Makefile provided in the source, making the following changes:

    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
    

    Then, when compiling your test project, you must:

    • Define GTEST_LINKED_AS_SHARED_LIBRARY=1
    • Set a library reference to either gtest_dll.lib or gtest_main_dll.lib.
    • Paste gtest.dll or gtest_main.dll in the same directory as your executable.

    (My understanding is that you use gtest_main only if you are NOT providing your own main() function.)

    Here is a sample Qt pro file based on the one I have this is (finally!) working:

    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