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 所需的库的主要内容,如果未能解决你的问题,请参考以下文章

CMake GoogleTests 在我的测试文件中找不到导入的头文件

在 Ubuntu 的 PATH 中找不到程序“g++”

在 Ubuntu 中找不到 H2 安装目录

在Ubuntu上的PATH中找不到程序“g ++”

无服务器:在 ubuntu 16.04 中找不到命令

Ubuntu中找不到pip3命令的解决方法