首页 > 解决方案 > 如何在不同的 CMakeList.txt 之间共享变量?

问题描述

我有一个项目有多个CMakeList.txt,一个用于代码,一个用于单元测试,另一个用于库,我想共享一些行CMakeList.txt以避免重复,例如:

cmake_minimum_required(VERSION 3.0)或者set(CMAKE_CXX_STANDARD 17)

我可以使用类似的东西include("MyProject/CMakeConfig.txt")吗?

标签: c++cmake

解决方案


通常,您有一个位于项目顶层的 CMake 列表文件,另一个用作子目录。由于cmake_minimum_required并且project项目需要一次,因此您应该在您的情况下不写任何内容。

下面是一个结构示例:

顶级./CMakeLists.txt

cmake_minimum_required(VERSION 3.0)
project(my-project CXX)

# set global property for all this file and subdirectories
set(CMAKE_CXX_STANDARD 17)

# needs to be at the top level
enable_testing()

add_subdirectory(src)
add_subdirectory(test)

src/CMakeLists.txt

add_executable(your-exec file1.cpp file2.cpp file3.cpp)
add_library(your-lib file4.cpp file5.cpp file6.cpp)

find_package(liba REQUIRED)

target_link_libraries(your-exec PUBLIC liba::liba)
target_include_directory(...)
# ...

test/CMakeLists.txt

find_package(Catch2 REQUIRED)
add_executable(test1 test1.cpp)

# link into you lib and a test framework
target_link_libraries(test1 PRIVATE your-lib Catch2::Catch2) 
add_test(NAME test1 COMMAND test1)

所有添加的子目录都将继承项目的基本属性,例如最低 CMake 版本、启用的语言和显式设置基于目录的属性,例如CMAKE_CXX_STANDARD.

尽管如此,添加 C++17 作为使用项目的要求总是一个好主意:

# All users of your-lib need C++17
target_compile_features(your-lib PUBLIC cxx_std_17)

推荐阅读