cmakelists 嵌套
时间: 2024-12-31 09:41:46 浏览: 9
### 实现嵌套或包含其他CMake文件的方法
在 `CMakeLists.txt` 中可以通过多种方式实现对其他 CMake 文件或子项目的引用和集成。主要方法包括使用 `add_subdirectory()` 和 `include()`。
#### 使用 `add_subdirectory()`
此函数用于向当前项目添加一个子目录及其对应的 `CMakeLists.txt` 文件,从而形成父子关系的多层结构[^2]:
```cmake
add_subdirectory(src/main/cpp/libmp3_encoder)
```
上述命令会查找并处理位于 `src/main/cpp/libmp3_encoder` 路径下的 `CMakeLists.txt` 文件。如果希望该子目录中的目标不自动加入全局构建,则可以加上参数 `EXCLUDE_FROM_ALL`:
```cmake
add_subdirectory(src/main/cpp/libmp3_encoder EXCLUDE_FROM_ALL)
```
这使得只有当显式指定时才会编译这个子模块的内容[^4]。
#### 使用 `include()`
对于那些不是完整的子项目而是辅助性的脚本或者设置文件来说,可以直接利用 `include()` 来引入它们。例如有一个名为 `common.cmake` 的文件包含了多个项目的公共配置项:
```cmake
include(common.cmake)
```
这样就可以把 `common.cmake` 中定义的所有变量、宏以及逻辑都带入到当前作用域内执行。
#### 完整示例
假设存在如下层次结构:
```
project_root/
├── CMakeLists.txt # 主CMakeLists.txt
└── src/
├── main.cpp # 源码文件
└── lib/
├── CMakeLists.txt # 子项目CMakeLists.txt
└── library_code.h # 库头文件
```
主 `CMakeLists.txt` 可能看起来像这样:
```cmake
cmake_minimum_required(VERSION 3.10)
project(MyProject)
# 添加子目录lib, 并加载其内部的CMakeLists.txt
add_subdirectory(src/lib)
aux_source_directory(. SRC_LIST)
add_executable(${PROJECT_NAME} ${SRC_LIST})
target_link_libraries(${PROJECT_NAME} PRIVATE my_library)
```
而 `src/lib/CMakeLists.txt` 则负责描述库本身的细节:
```cmake
add_library(my_library STATIC library_code.h)
```
通过这样的安排,不仅能够保持良好的组织形式,还简化了大型工程中不同部分间的依赖管理和版本控制问题[^3]。
阅读全文