文章目录
1.概述
add_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL])
其中:
source_dir
是要添加的子目录的路径。binary_dir
是可选的二进制目录路径,用于指定子目录的构建输出目录。如果未指定,将使用默认的构建输出目录。EXCLUDE_FROM_ALL
是可选的参数,用于指定是否将子目录排除在构建过程之外。如果指定了该参数,子目录将不会在构建时被构建。
使用 add_subdirectory
命令后,CMake 会在指定的 source_dir
中查找 CMakeLists.txt 文件,并执行该文件中的命令。这样,您可以将子目录作为独立的项目进行构建,并与主项目进行协作。
通常,在子目录的 CMakeLists.txt 文件中,您可以定义和配置子目录的构建过程、生成库或可执行文件,并使用 target_link_libraries
命令将子目录的目标与主项目的目标进行链接。
2.添加子目录
假设您的项目结构如下:
project/
├── CMakeLists.txt
├── main.cpp
└── subdirectory/
├── CMakeLists.txt
├── lib/
│ ├── CMakeLists.txt
│ ├── lib.cpp
│ └── lib.h
└── tests/
├── CMakeLists.txt
└── test.cpp
在主项目的 CMakeLists.txt 文件中,您可以使用 add_subdirectory
命令将子目录添加到主项目中:
cmake_minimum_required(VERSION 3.12)
project(MyProject)
# 主项目的构建配置
# 添加子目录
add_subdirectory(subdirectory)
# 主项目的目标和链接等配置
在子目录的 CMakeLists.txt 文件中,您可以定义子目录的构建过程和目标:
# 子目录的 CMakeLists.txt
# 子目录的构建配置
# 生成库或可执行文件
add_library(mylib lib/lib.cpp lib/lib.h)
# 子目录的目标和链接等配置
通过 add_subdirectory
命令,子目录中的 CMakeLists.txt 文件将被执行,子目录的构建过程和目标将与主项目一起构建和链接。
请注意,add_subdirectory
命令应该在主项目的 CMakeLists.txt 文件中使用,并且应该在主项目的目标和链接配置之前。这样可以确保子目录的目标在主项目的构建过程中可用。
3.指定二进制目录
add_subdirectory(subdirectory bin)
这将在主项目的构建目录下创建一个名为 bin
的子目录,用于存放子目录的构建输出。
4.排除子目录
add_subdirectory(tests EXCLUDE_FROM_ALL)
这将排除名为 tests
的子目录,使其不会在构建主项目时被构建。
5.使用别名
add_subdirectory(subdirectory)
add_executable(myapp main.cpp)
target_link_libraries(myapp PRIVATE subdirectory::mylib)
这里,subdirectory::mylib
是对子目录中名为 mylib
的目标的别名,可以直接在主项目中使用。
6.传递变量
set(MY_VARIABLE "Hello, World!")
add_subdirectory(subdirectory)
在子目录的 CMakeLists.txt 文件中,可以访问和使用 MY_VARIABLE
变量。
7.检查子目录是否存在
if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/subdirectory")
add_subdirectory(subdirectory)
else()
message(FATAL_ERROR "Subdirectory 'subdirectory' does not exist.")
endif()
这将在子目录存在时添加子目录,否则会发出错误消息并停止构建。