Cmake add_subdirectory() 使用
复杂C++项目会由多个子模块组成,使用add_subdirectory
有如下几种好处。
- 模块化和组织性: 当项目变得越来越大并涉及多个子模块或子目录时,使用
add_subdirectory
可以将不同模块的构建过程分开管理,使项目结构更加清晰和模块化。每个子目录可以有自己的 CMake 构建文件,可以独立地定义目标、依赖项和编译选项。 - 可重用性: 使用
add_subdirectory
可以促进代码的可重用性。你可以将通用的模块或库封装为一个子目录,并在多个项目中重复使用,而不需要重复编写构建逻辑和设置。 - 依赖管理: 当一个模块依赖于其他模块或库时,使用
add_subdirectory
可以方便地管理这些依赖关系。通过将依赖项的构建过程集成到主项目中,可以确保依赖项在需要时正确构建和链接。 - 并行构建: 使用
add_subdirectory
可以允许 CMake 在构建过程中并行处理不同的子目录,从而提高构建效率。这意味着不同的子目录可以并行地编译和链接,加快整体构建时间。
创建项目
项目目录结构如下:
bash
.
├── CMakeLists.txt
├── main.cpp
└── sub
├── CMakeLists.txt
├── test.cpp
└── test.h
sub/
是一个子模块,其拥有自己的CMakeLists.txt
文件。
sub/test.h
文件:
cpp
#include <iostream>
void test(const std::string& str);
sub/test.cpp
文件:
cpp
#include "test.h"
void test(const std::string& str) {
std::cout << str << std::endl;
}
sub/CMakeLists.txt
文件:
cmake
project(sub)
file(GLOB sources "*.cpp" "*.h")
add_library(sub ${sources})
main.cpp
文件:
cpp
#include "sub/test.h"
#include <iostream>
int main(int argc, char** argv)
{
std::cout << "In main..." << std::endl;
test("hello, world!");
return 0;
}
CMakeLists.txt
文件:
cmake
cmake_minimum_required(VERSION 3.23)
project(CmakeTest)
set(CMAKE_CXX_STANDARD 14)
add_subdirectory(sub)
add_executable(CmakeTest main.cpp)
target_link_libraries(CmakeTest sub)
程序执行结果:
bash
In main...
hello, world!
Process finished with exit code 0