C++ CMake文件分别构建主测试和测试

C++ CMake文件分别构建主测试和测试,c++,cmake,linker-errors,C++,Cmake,Linker Errors,我有以下目录结构: main.cpp CMakeLists.txt src/ some_function.h some_function.cpp some_class.h some_class.cpp CMakeLists.txt test/ catch.hpp tests.cpp CMakeLists.txt 项目根目录中的CmakeLists.txt: cmake_minimum_required(VERSION 3.16)

我有以下目录结构:

main.cpp
CMakeLists.txt
src/
    some_function.h
    some_function.cpp
    some_class.h
    some_class.cpp
    CMakeLists.txt
test/
    catch.hpp
    tests.cpp 
    CMakeLists.txt
项目根目录中的CmakeLists.txt:

cmake_minimum_required(VERSION 3.16)
set(CMAKE_CXX_STANDARD 11) # C++11

project(main)

add_subdirectory (src)

add_executable(main main.cpp)

target_link_libraries (main some_class)
cmake_minimum_required(VERSION 3.16)
set(CMAKE_CXX_STANDARD 11) # C++11

project(main)

add_subdirectory (src)
# Add the test sub-directory also.
add_subdirectory(test)

add_executable(main main.cpp)

target_link_libraries (main some_class)
src/中的CmakeLists.txt:

add_library (some_class some_class.h some_class.cpp some_function.h some_function.cpp)
以上内容用于构建和运行
main
目标

现在我想构建并运行测试。文件tests.cpp包括一些_function.h和一些_class.h。但是,我不知道如何在这里添加src/目录

这就是我到目前为止在测试中所做的/(导致某个函数中的函数出现链接错误。h):


只需将
some_class
库目标链接到
tests
目标,就像您使用
main
可执行目标那样

项目根目录中的CmakeLists.txt:

cmake_minimum_required(VERSION 3.16)
set(CMAKE_CXX_STANDARD 11) # C++11

project(main)

add_subdirectory (src)

add_executable(main main.cpp)

target_link_libraries (main some_class)
cmake_minimum_required(VERSION 3.16)
set(CMAKE_CXX_STANDARD 11) # C++11

project(main)

add_subdirectory (src)
# Add the test sub-directory also.
add_subdirectory(test)

add_executable(main main.cpp)

target_link_libraries (main some_class)
test
目录中的CmakeLists.txt:

project(tests)

set(CATCH_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR})
add_library(Catch INTERFACE)
target_include_directories(Catch INTERFACE ${CATCH_INCLUDE_DIR})

add_executable(tests tests.cpp)
# Link 'some_class' here also!
target_link_libraries(tests PRIVATE some_class Catch)

add_library()
add_executable()
创建的普通目标具有项目的范围而不是目录,这就是为什么它们的名称在项目中必须是唯一的。因此,即使target
tests
不在
src/
的子目录中,您也可以将某个类链接到您的target
tests

对应于逻辑目标名称,并且在项目中必须是全局唯一的

参考:

这是导入目标的情况,而不是

[imported]目标名称在创建它的目录及其下方具有作用域,但全局选项扩展了可见性。它可以像项目中构建的任何目标一样被引用

参考: