在大型项目中以现代CMake方式添加标题

时间:2019-01-01 02:50:44

标签: c++ cmake

我正在从事一个项目,该项目包括基于SDL的游戏框架,编辑器和游戏。目录结构即将变成这样(为简便起见进行编辑)

├── CMake
├── Libraries
├── Resources
└── Source
    ├── Editor
    ├── Framework
    │   └── Source
    │       ├── AI
    │       │   ├── Private
    │       │   └── Public
    │       ├── Game
    │       │   ├── Private
    │       │   └── Public
    │       ├── Graphics
    │       │   ├── Private
    │       │   └── Public
    │       └── Networking
    ├── Game
    │   └── Source
    │       └── Runtime
    │           └── Launch
    │               ├── Private
    │               └── Public
    └── Server

我的add_executable命令正在游戏/源代码/运行时/启动/私人中运行,并且依赖于其他模块中的文件。

根据一些CMake的操作方法和对以下问题的接受的回答,给定目标的标头应包含在add_executable调用中,以便它们在makefile中作为依赖项列出。 / p>

How to properly add include directories with CMake

我的问题是,鉴于我的项目中有很多头文件和目录,最干净的方法是什么?我无法想象最佳实践是直接在add_executable调用中维护庞大的文件列表,但是我可能是错的。

我当时在想,每个目录的CMakeLists.txt可能负责添加到最终将在add_executable中使用的变量,但是通过如此多的文件分发该意图似乎是不明智的做法。有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

您可以完全按照您发送的链接中的模式进行操作。对于每个库(我想它们都是CMake中的库/目标),请使用:

target_include_directories(${target} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/Private PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/Public)

这样做,您告诉CMake私有文件夹仅用于当前目标,但是如果有人将目标用于另一个目标,则应该添加公共包含目录。

现在,您只需要执行以下操作:

target_link_libraries(${target} PRIVATE Framework_Source)

如果Framework_Source是目标的名称。 ${target}是您当前正在构建的目标的名称。