链接 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)
目标 gtest
和 gtest_main
仅在通过 add_subdirectory()
方法使用 GTest 时创建。
当通过 find_package()
使用 GTest 时,需要相应地使用 IMPORTED 目标 GTest::GTest
和 GTest::Main
,或者变量 GTEST_LIBRARIES
和 GTEST_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})
我有以下 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 Testgtest
library, if found; adds Thread::Thread automatically
GTest::Main
: The Google Testgtest_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)
目标 gtest
和 gtest_main
仅在通过 add_subdirectory()
方法使用 GTest 时创建。
当通过 find_package()
使用 GTest 时,需要相应地使用 IMPORTED 目标 GTest::GTest
和 GTest::Main
,或者变量 GTEST_LIBRARIES
和 GTEST_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})