Skip to content

Cmake add_subdirectory() 使用

复杂C++项目会由多个子模块组成,使用add_subdirectory 有如下几种好处。

  1. 模块化和组织性: 当项目变得越来越大并涉及多个子模块或子目录时,使用 add_subdirectory 可以将不同模块的构建过程分开管理,使项目结构更加清晰和模块化。每个子目录可以有自己的 CMake 构建文件,可以独立地定义目标、依赖项和编译选项。
  2. 可重用性: 使用 add_subdirectory 可以促进代码的可重用性。你可以将通用的模块或库封装为一个子目录,并在多个项目中重复使用,而不需要重复编写构建逻辑和设置。
  3. 依赖管理: 当一个模块依赖于其他模块或库时,使用 add_subdirectory 可以方便地管理这些依赖关系。通过将依赖项的构建过程集成到主项目中,可以确保依赖项在需要时正确构建和链接。
  4. 并行构建: 使用 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