如何编译一个 gtest 的 cpp 文件?

4
在Ubuntu Linux上,我一直按照这里给出的指示使用手动复制头文件和库到/usr/include/usr/lib来安装gtest
然后我尝试编译以下代码(test1.cpp):
#include <gtest/gtest.h>
TEST(MathTest, TwoPlusTwoEqualsFour) {
    EXPECT_EQ(2 + 2, 4);
}

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

使用以下命令
g++ -lgtest -lgtest_main -lpthread test1.cpp 

只是为了看到另一个毫无帮助的错误信息:
/usr/bin/ld: /tmp/ccQlmghI.o: undefined reference to symbol '_ZN7testing8internal9EqFailureEPKcS2_RKSsS4_b'
/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib/libgtest.so: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status

我该怎么解决这个问题?还是说有其他可以用简单方式使用的单元测试框架,并且有工作示例?

同样的问题已经在这里被问到,但没有答案。

2个回答

9

g++的参数顺序非常重要。源文件应该在目标文件和库之前(从高级到低级库等)。请阅读有关调用GCC的章节。

因此,请尝试:

g++ -Wall -g -pthread test1.cpp -lgtest_main  -lgtest -lpthread 

1
"-pthread告诉gcc使用pthread库,无需使用-lpthread" - Galik
那么你也可以只写-gtest_main而不是-lgtest_main,对吗? - Alex
1
不,-pthread 是 GCC 的内置开关,而不是一般链接库的新方式。 - Galik
我应该发起一个新问题来尝试解决我的新问题吗? - Alex
我认为你应该花几个小时阅读文档(关于GCC、Gtest、autotools等)。 - Basile Starynkevitch
显示剩余5条评论

1

如果要将 gtest 库链接到您的 gtest 上,似乎必须使用静态 gtest 库(原因未知;请参见 此处)。因此,不要像使用命令行那样:

g++ -Wall -g -pthread test1.cpp -lgtest_main  -lgtest -lpthread

必须使用

g++ -Wall -g  -pthread test1.cpp    /usr/lib/libgtest.a 

这里,库位于/usr/lib,但是根据 gtest 的安装方式,文件libgtest.a可能位于其他位置。


你在安装 gtest 后运行了 ldconfig 命令吗? - Basile Starynkevitch
使用“-L”来指定库的附加搜索路径,而不是直接引用特定的“.a”文件。 - πάντα ῥεῖ
太好了!为了进一步解释你的答案,g++ -Wall -g -pthread test1.cpp -lgtest 对我有效。 - FriskySaga

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接