CMake 在 Ubuntu 中找不到 GoogleTest 所需的库
Posted
技术标签:
【中文标题】CMake 在 Ubuntu 中找不到 GoogleTest 所需的库【英文标题】:CMake cannot find GoogleTest required library in Ubuntu 【发布时间】:2014-06-18 22:15:47 【问题描述】:类似问题here。
这是我的 CMakeLists.txt:
cmake_minimum_required(VERSION 2.6)
# Locate GTest
find_package(GTest REQUIRED)
include_directories($GTEST_INCLUDE_DIRS)
# Add test cpp file
add_executable(foo foo.cpp)
# Link test executable against gtest & gtest_main
target_link_libraries(foo $GTEST_LIBRARIES $GTEST_MAIN_LIBRARIES pthread)
还有我的 foo.cpp:
#include <gtest/gtest.h>
TEST(sample_test_case, sample_test)
EXPECT_EQ(1, 1);
int main(int argc, char **argv)
testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
现在,使用 g++ 编译器时一切正常。但是,在尝试使用 QNX 的编译器 ntox86-c++ 时,我遇到了这个问题:
/usr/share/cmake-2.8/Modules/FindPackageHandleStandardArgs.cmake:97 (MESSAGE) 处的 CMake 错误: 找不到 GTest(缺少:GTEST_LIBRARY GTEST_INCLUDE_DIR GTEST_MAIN_LIBRARY)
我在 Ubuntu 上使用 ntox86-c++ 编译器、googletest 和 cmake-gui。
什么给了?
【问题讨论】:
这发生在我安装 gtest 而不是 gtest-devel 时。在 Ubuntu 上,我猜你需要类似sudo apt-get install libgtest-dev
您能否在收到错误消息之前分享最后的输出。我认为它将测试是否存在某些标头(包含)或库。这将有助于缩小问题范围。
【参考方案1】:
Google 测试可能没有正确安装(libgtest-dev
可能只安装需要编译的源文件)。我遇到了同样的问题,我按照http://www.eriksmistad.no/getting-started-with-google-test-on-ubuntu/的说明进行操作
sudo apt-get install libgtest-dev
sudo apt-get install cmake # install cmake
cd /usr/src/gtest
sudo cmake CMakeLists.txt
sudo make
#copy or symlink libgtest.a and libgtest_main.a to your /usr/lib folder
sudo cp *.a /usr/lib
这对我有用。
【讨论】:
您不应该将您的库复制到 /usr/lib。而是向 CMake 传递正确的标志,例如 GTEST_ROOT 或将您的 GTest 目录添加到 CMake 的搜索路径中。 @detrick 在运行sudo cmake CMakeLists.txt
编译libgtest-dev
之前忘记添加cd /usr/src/gtest
请注意,您不应手动复制生成的文件。相反,使用sudo make install
【参考方案2】:
正如@detrick 所解释的,Ubuntu 软件包libgtest-dev
仅安装源,因此您需要自己构建和安装库。
但是,从 Ubuntu 18.04 开始,有一种比其他答案中的手动命令更简单的构建和安装方法:
sudo apt install libgtest-dev build-essential cmake
cd /usr/src/googletest
sudo cmake .
sudo cmake --build . --target install
【讨论】:
这在 Ubuntu 16.04 中不起作用。没有规则使目标“安装”。 @jinge,你是对的,这适用于 Ubuntu 18.04 及更高版本。我相应地更新了答案。【参考方案3】:ntox86-c++ 看起来像一个交叉编译器,libgtest-dev
包没有为目标平台 (QNX) 提供编译库。
自 2014 年以来,编译的库已从 libgtest-dev
中删除,并在 Ubuntu-20.04 焦点中再次添加,因此 find_package(GTest REQUIRED)
不适用于 Ubuntu-16.04 xenial 和 Ubuntu-18.04 仿生。原因在/usr/share/doc/googletest/README.Debian
(/usr/share/doc/libgtest-dev/README.Debian
) 和例如在/usr/src/googletest/googletest/docs/V1_7_FAQ.md
“为什么不建议安装谷歌测试的预编译副本(例如,安装到/usr/local
)”部分。库和测试的编译器标志的差异可能会生成不兼容的可执行代码。 18.04 和 16.04 的问题是我决定为旧问题添加另一个答案的原因。
add_subdirectory
可以用来编译系统包提供的gtest
set(GTest_ROOT /usr/src/googletest/googletest)
add_subdirectory($GTest_ROOT
"$CMAKE_CURRENT_BINARY_DIR/googletest" EXCLUDE_FROM_ALL)
add_executable(test test.cpp)
target_link_libraries(test gtest_main)
# or just gtest if main function is defined
对于 googletest 源,至少有 2 个变体如何从 git 获取特定版本(除了明显的子模块),而不是使用系统包,请参阅
https://cmake.org/cmake/help/latest/module/FetchContent.html https://github.com/google/googletest/blob/master/googletest/README.md【讨论】:
【参考方案4】:前段时间我创建了一个 dockerfile,它可以帮助我保留一种配方,以便以后在我的系统上进行谷歌测试:
apt-get install -y git g++ make cmake
git clone https://github.com/google/googletest.git
cd googletest
mkdir gbuild && cd gbuild && cmake .. && make
cp -r googletest/include/gtest /usr/local/include
cp gbuild/googlemock/gtest/lib*.a /usr/local/lib
cp gbuild/googlemock/lib*.a /usr/local/lib
希望对你有帮助:)
【讨论】:
以上是关于CMake 在 Ubuntu 中找不到 GoogleTest 所需的库的主要内容,如果未能解决你的问题,请参考以下文章