Ubuntu x64下命令行运行gtest的C++单元测试报错求助
解决Ubuntu下gtest命令行编译C++单元测试的错误
首先,你的编译命令里存在几个关键错误,导致运行失败,我来逐一拆解并给出正确的解决方案:
你的命令里的问题点
- 参数误用:
-I usr/lib/libgtest.a完全用错了!-I是用来指定头文件搜索目录的,而libgtest.a是库文件,而且路径还少了开头的/(正确路径应该是/usr/lib)。这里应该用-L指定库目录,或者直接引用库文件的完整路径。 - 无效的库链接参数:
-l -lpthread里的-l后面没有跟具体库名,这会让编译器直接报错,正确的做法是明确指定要链接的gtest相关库。
正确的编译命令(分两种场景)
场景1:通过apt安装了系统版gtest
如果你已经用sudo apt install libgtest-dev libgmock-dev安装了系统自带的gtest库,那么命令可以简化为:
g++ -o tester MyClass1.cpp MyClass1Test.cpp -lgtest -lgtest_main -lpthread
(注:Ubuntu下可执行文件不需要加.exe后缀,这是Windows的命名习惯,当然加了也能运行,但没必要遵循)
场景2:使用自己下载编译的googletest源码
如果你是自己下载了googletest源码(比如你命令里的googletest目录),首先要确保你已经编译过源码(只需要做一次):
cd googletest mkdir build && cd build cmake .. && make
然后用下面的命令编译你的测试程序:
g++ -o tester MyClass1.cpp MyClass1Test.cpp \ -I googletest/googletest/include \ -I googletest/googlemock/include \ -L googletest/build/lib \ -lgtest -lgtest_main -lpthread
或者更直接地指定库文件路径(避免库目录配置的问题):
g++ -o tester MyClass1.cpp MyClass1Test.cpp \ -I googletest/googletest/include \ -I googletest/googlemock/include \ googletest/build/lib/libgtest.a \ googletest/build/lib/libgtest_main.a \ -lpthread
参数细节解释
-I <目录>:告诉编译器去哪里找头文件(比如gtest/gtest.h),这里只需要指定gtest和gmock的include子目录即可,不需要指定源码根目录(googletest/googletest)。-L <目录>:指定库文件的搜索目录,让编译器能找到编译好的libgtest.a等库文件。-l<库名>:链接对应的库,-lgtest对应libgtest.a,-lgtest_main是gtest提供的默认主函数(如果你的测试文件里没有自己写main()函数调用RUN_ALL_TESTS(),必须加这个参数)。-lpthread:gtest内部用到了多线程机制,必须链接pthread库才能正常运行。
额外注意事项
如果你的MyClass1Test.cpp里已经自己实现了main函数,比如:
int main(int argc, char **argv) { testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); }
那编译时可以去掉-lgtest_main参数,避免出现重复定义主函数的编译错误。
内容的提问来源于stack exchange,提问作者MasterJT14
相关产品推荐
相关产品推荐

