链接 GTest 失败

Linking against GTest fails

我有以下 CMakeLists.txt:

cmake_minimum_required(VERSION 3.15)

set(CMAKE_CXX_STANDARD 17)

# adding library
set(ST_SRC simple_tree.cpp)
add_library(st ${ST_SRC})
target_include_directories(st PUBLIC ${PROJECT_SOURCE_DIR}/include/data_structures/simple_tree/)

# adding googletest
set(GOOGLETEST_PATH ~/local/googletest)
set(GTEST_INCLUDE_DIR ~/local/include/)
set(GTEST_LIBRARY ~/local/lib/)
set(GTEST_MAIN_LIBRARY ~/local/lib/)
find_package(GTest REQUIRED)

# adding tests
set(TEST_TARGET test_simple_tree)
add_executable(${TEST_TARGET} test_simple_tree.cpp)
target_include_directories(${TEST_TARGET}
                        PUBLIC
                        ${PROJECT_SOURCE_DIR}/include/data_structures/simple_tree
                        ${GOOGLETEST_PATH}
                        ${GTEST_INCLUDE_DIR})
target_link_libraries(${TEST_TARGET} PUBLIC st)
target_link_libraries(${TEST_TARGET} PUBLIC gtest gtest_main)

基本上,我已将 googletest 安装到我的主目录而不是系统范围内。 find_package() 命令显然成功了。但是,尝试构建 test_simple_tree 失败并显示:

/usr/bin/ld: cannot find -lgtest
/usr/bin/ld: cannot find -lgtest_main

在此 CMakeLists.txt 中,我还能如何告诉链接器到别处查找 gtest?

编辑:阅读文档后,我已经修复了 Gtest 问题,如下所述。但是,出现以下问题:

如果 find_package() 成功找到 GTest includes/libraries,它应该根据 CMake FindGTest 文档为您填充目标:

This module defines the following IMPORTED targets:

GTest::GTest: The Google Test gtest library, if found; adds Thread::Thread automatically

GTest::Main: The Google Test gtest_main library, if found

您应该在 target_link_libraries() 命令中使用它们。此外,CMake 将填充 GTEST_INCLUDE_DIRS,但 GTest 包含目录应从上述 导入的目标 中提取。


另一个重要说明:我不确定您是否发布了 所有 的 CMake 代码,但我没有在您的代码中看到 project() 调用。因此,${PROJECT_SOURCE_DIR} 变量可能不是您所期望的。一般来说,最好在 CMake 的顶部使用 project() 声明项目。

经过这些修改后的 CMake 文件可能如下所示:

cmake_minimum_required(VERSION 3.15)

project(simple_tree_example)

set(CMAKE_CXX_STANDARD 17)

# adding library
set(ST_SRC simple_tree.cpp)
add_library(st ${ST_SRC})
target_include_directories(st PUBLIC 
    ${PROJECT_SOURCE_DIR}/include/data_structures/simple_tree/)

# adding googletest
set(GOOGLETEST_PATH ~/local/googletest)
set(GTEST_INCLUDE_DIR ~/local/include/)
set(GTEST_LIBRARY ~/local/lib/)
set(GTEST_MAIN_LIBRARY ~/local/lib/)
find_package(GTest REQUIRED)

# adding tests
set(TEST_TARGET test_simple_tree)
add_executable(${TEST_TARGET} test_simple_tree.cpp)
target_include_directories(${TEST_TARGET}
                        PUBLIC
                        ${PROJECT_SOURCE_DIR}/include/data_structures/simple_tree
                        ${GOOGLETEST_PATH})
target_link_libraries(${TEST_TARGET} PUBLIC st GTest::GTest GTest::Main)

目标 gtestgtest_main 仅在通过 add_subdirectory() 方法使用 GTest 时创建。

当通过 find_package() 使用 GTest 时,需要相应地使用 IMPORTED 目标 GTest::GTestGTest::Main,或者变量 GTEST_LIBRARIESGTEST_MAIN_LIBRARIES。这在 documentation:

中有描述
find_package(GTest REQUIRED)
...
target_link_libraries(test_simple_tree PUBLIC GTest::GTest gtest_main)

find_package(GTest REQUIRED)
...
# That case we need to add include directories
target_include_directories(test_simple_tree ${GTEST_INCLUDE_DIRS})
target_link_libraries(test_simple_tree PUBLIC ${GTEST_LIBRARIES} ${GTEST_MAIN_LIBRARIES})