Cmake 与GTest的链接失败
我有以下Cmake 与GTest的链接失败,cmake,googletest,Cmake,Googletest,我有以下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_tre
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\u simple\u tree
失败,原因是:
/usr/bin/ld: cannot find -lgtest
/usr/bin/ld: cannot find -lgtest_main
在这个CMakeLists.txt
中,我还能告诉链接器去别处看看吗
对于gtest
编辑:在阅读文档之后,我已经修复了Gtest
问题,如下所述。但是,出现了以下问题:如果find_package()
成功地找到了GTest包含/库,则应根据CMake文档为您填充目标:
此模块定义以下导入的目标:
GTest::GTest
:
谷歌测试gtest
库(如果找到);自动添加Thread::Thread
GTest::Main
:
谷歌测试gtest_main
库,如果找到
您应该在target\u link\u libraries()
命令中使用它们。此外,CMake将填充GTEST_INCLUDE_DIRS
,但GTEST INCLUDE目录应从上述导入的目标中拉入
另一个重要注意事项:我不确定您是否发布了所有的CMake代码,但我没有在代码中看到project()
调用。因此,${PROJECT\u SOURCE\u 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)
如果find_package()
成功地找到了GTest包含/库,则应根据CMake文档为您填充目标:
此模块定义以下导入的目标:
GTest::GTest
:
谷歌测试gtest
库(如果找到);自动添加Thread::Thread
GTest::Main
:
谷歌测试gtest_main
库,如果找到
您应该在target\u link\u libraries()
命令中使用它们。此外,CMake将填充GTEST_INCLUDE_DIRS
,但GTEST INCLUDE目录应从上述导入的目标中拉入
另一个重要注意事项:我不确定您是否发布了所有的CMake代码,但我没有在代码中看到project()
调用。因此,${PROJECT\u SOURCE\u 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)
只有通过add_subdirectory()
方法使用gtest时,才会创建目标gtest
和gtest_main
当通过find_package()
使用GTest时,需要相应地使用导入的目标GTest::GTest
和GTest::Main
,或者变量GTest_库
和GTest_主库
。以下章节对此进行了描述:
或
只有通过add_subdirectory()
方法使用gtest时,才会创建目标gtest
和gtest_main
当通过find_package()
使用GTest时,需要相应地使用导入的目标GTest::GTest
和GTest::Main
,或者变量GTest_库
和GTest_主库
。以下章节对此进行了描述:
或
这不是对您的问题的回答,但此CMake文件不需要将Google测试的包含目录添加到Test\u simple\u树
目标中。当您使用target\u link\u库
声明依赖项时,CMake应自动处理此问题。这不是对您问题的回答,但此CMake文件不需要将Google测试的包含目录添加到Test\u simple\u树
目标。当您使用target\u link\u库
声明依赖项时,CMake应该自动处理这一点。我同意project()
,但我只是将其作为一个较大模块中的一个小模块来构建,因此project\u SOURCE\u DIR
应该引用“root”目录,它也是这样做的(IDE显示适当的自动完成提示)。我同意project()
,但我只是将其构建为一个较大模块中的一个小模块,因此project\u SOURCE\u DIR
应该引用“root”目录,它确实如此(IDE显示适当的自动完成提示)。
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})