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()
创建的普通目标具有项目的范围而不是目录,这就是为什么它们的名称在项目中必须是唯一的。因此,即使targettests
不在src/
的子目录中,您也可以将某个类链接到您的targettests
对应于逻辑目标名称,并且在项目中必须是全局唯一的
参考:
这是导入目标的情况,而不是
[imported]目标名称在创建它的目录及其下方具有作用域,但全局选项扩展了可见性。它可以像项目中构建的任何目标一样被引用
参考: