【发布时间】:2021-10-11 12:05:29
【问题描述】:
这是一个非常简单的使用 gtest 的脚本(保存在 gt.cpp 文件中)
#include<gtest/gtest.h>
double timesTwo(double x){return x*2;}
TEST(testTimesTwo, integerTests){EXPECT_EQ(6, timesTwo(3));}
int main(int argc, char* argv[]){
testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
使用 CLANG (Apple clang version 11.0.3) 可以很好地编译脚本
clang++ -std=c++17 -lgtest gt.cpp -o gt
但 GCC 失败 (g++ (GCC) 10.2.0)
g++ -std=c++17 -lgtest gt.cpp -o gt
gt.cpp:2:9: fatal error: gtest/gtest.h: No such file or directory
2 | #include<gtest/gtest.h>
|
使用 CLANG 中的 -H 选项,我看到头文件包含在 /usr/local/include 中。另外,我可以在/usr/local/bin/ 中找到libgtest.a 文件。所以,我做到了
g++ -std=c++17 gt.cpp -o gt -I/usr/local/include/ -L/usr/local/lib/ -lgtest
得到了一长串以
开头的未定义符号Macavity:test remi$ g++ -std=c++17 gt.cpp -o gt -I/usr/local/include/ -L/usr/local/lib/ -lgtest
Undefined symbols for architecture x86_64:
"__ZN7testing8internal9EqFailureEPKcS2_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESA_b", referenced from:
__ZN7testing8internal18CmpHelperEQFailureIidEENS_15AssertionResultEPKcS4_RKT_RKT0_ in ccrUwUPO.o
"__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE4findEcm", referenced from:
__ZN7testing8internal11SplitStringERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEcPNS1_6vectorIS7_NS5_IS7_EEEE in libgtest.a(gtest-all.cc.o)
__ZN7testing8internalL21FormatDeathTestOutputERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE in libgtest.a(gtest-all.cc.o)
"__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE7compareEmmPKcm", referenced from:
你能帮我弄清楚为什么GCC在这里编译失败吗?
【问题讨论】:
-
-L/usr/local/include/usr/local/lib)? -
which命令用于查看可执行文件的位置,不一定与库头或库二进制文件的位置有关。 -
@Michael
clang++ -H ...输出的第一行是. /usr/local/include/gtest/gtest.h。现在这是头文件。我不确定库文件。 -
这是头文件/包含文件。我说的是图书馆(即
libgtest.a或其他任何名称)。 -
@Michael 是的,你说得对,图书馆可能包含在
/usr/local/lib中(我确认我可以在那里找到libgtest.a)。我也试过g++ -std=c++17 gt.cpp -o gt -I/usr/local/include/ -L/usr/local/lib/ -lgtest,但它也返回链接器错误(未定义的符号)。
标签: c++ compilation linker static-libraries googletest