关于C ++:CMake在Ubuntu中找不到GoogleTest所需的库

CMake cannot find GoogleTest required library in Ubuntu

类似的问题在这里。

这是我的CMakeLists.txt:

1
2
3
4
5
6
7
8
9
10
11
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:

1
2
3
4
5
6
7
8
9
10
11
12
#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 ++时,我遇到了这个问题:

CMake Error at /usr/share/cmake-2.8/Modules/FindPackageHandleStandardArgs.cmake:97 (MESSAGE):
Could NOT find GTest (missing: GTEST_LIBRARY GTEST_INCLUDE_DIR
GTEST_MAIN_LIBRARY)

我在使用ntox86-c ++编译器,googletest和cmake-gui的Ubuntu上。

是什么赋予了?


Google测试可能未正确安装(libgtest-dev可能仅安装需要编译的源文件)。我遇到了同样的问题,并且按照http://www.eriksmistad.no/getting-started-with-google-test-on-ubuntu/中的说明进行操作

1
2
3
4
5
6
7
8
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

这对我有用。


如@detrick所述,Ubuntu软件包libgtest-dev仅安装源代码,因此您需要自己构建和安装库。

但是,从Ubuntu 18.04开始,存在比其他答案中的手动命令更简单的构建和安装方式:

1
2
3
4
sudo apt install libgtest-dev build-essential cmake
cd /usr/src/googletest
sudo cmake .
sudo cmake --build . --target install


ntox86-c ++看起来像是交叉编译器,libgtest-dev程序包不提供目标平台(QNX)的已编译库。

自2014年以来,已编译的库已从libgtest-dev中删除,并已在Ubuntu-20.04 focus中再次添加,因此find_package(GTest REQUIRED)在Ubuntu-16.04 xenial和Ubuntu-18.04 bionic上不起作用。原因在/usr/share/doc/googletest/README.Debian(/usr/share/doc/libgtest-dev/README.Debian)和例如/usr/src/googletest/googletest/docs/V1_7_FAQ.md中的"为什么不建议安装Google Test的预编译副本(例如,到/usr/local中)"部分。库和测试的编译器标志不同可能会生成不兼容的可执行代码。 18.04和16.04的问题是我决定为旧问题添加另一个答案的原因。

add_subdirectory可用于编译系统软件包提供的gtest

1
2
3
4
5
6
7
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

至少有2种变体如何从git中获取特定版本(除了明显的子模块),而不是对googletest源使用系统软件包。

  • https://cmake.org/cmake/help/latest/module/FetchContent.html
  • https://github.com/google/googletest/blob/master/googletest/README.md

前一段时间,我创建了一个dockerfile,它可以帮助我保留某种食谱,以便稍后在我的系统上的google test上安装:

1
2
3
4
5
6
7
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

希望对您有所帮助:)