我有一个简单的测试文件,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
这导致与gtest函数相关的17个“未解析的外部符号”错误。
我把头发拉到这里,因为我确信它很简单。有什么想法吗?
以下是一些未定义的外部符号:
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)
答案 0 :(得分: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
然后,在编译测试项目时,您必须:
(我的理解是,只有在不提供自己的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
答案 1 :(得分:3)
我正在使用Qt + gtest / gmock而没有任何问题。我刚用不同的斜杠测试了所有可能的绝对/相对路径组合,但我无法重现你的问题。你有没有检查过qmake生成的Makefile.Debug中“LIBS”变量的内容?
这里有一些通用的建议:不要使用任何绝对路径,因为你的代码不会在你自己的其他机器上编译,除非你将它下载到exacly相同的位置(这可能是不可能的,因为不同的Qt设置等)。相反,使用相对路径,也适用于第三方库。
我将第三方库保留在版本控制系统中(你使用一个,对吧?)。我有一个“3rdparty”目录,对于每个使用这些库的项目,我添加了svn:external属性,指向明确指定的第三方库的版本。最后一部分很重要,因为它确保您即使在更新第三方库时也能够构建项目的每个修订版。
答案 2 :(得分:0)
我认为你的qmake文件没问题。但为什么INCLUDEPATH绝对和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