Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cmake 与GTest的链接失败_Cmake_Googletest - Fatal编程技术网

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})