c++ - 在大型项目中以现代 CMake 方式添加 header

标签 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 命令正在 Game/Source/Runtime/Launch/Private 中运行,并且依赖于来自其他模块的文件。

根据一些 CMake how-tos 和接受的对以下问题的回答,给定目标的 header 应该包含在 add_executable 调用中,以便它们被列为依赖项生成文件。

How to properly add include directories with CMake

我的问题是,鉴于我的项目中有大量的头文件和目录,实现此目的的最简洁方法是什么?我无法想象最好的做法是直接在 add_executable 调用中维护一个巨大的文件列表,但我可能是错的。

我在想,每个目录的 CMakeLists.txt 都可以负责添加到最终将在 add_executable 中使用的变量,但是通过这么多文件分发该意图似乎是一种糟糕的做法。有没有更好的办法?

最佳答案

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

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

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

现在,您只需要做:

target_link_libraries(${target} PRIVATE Framework_Source)

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

关于c++ - 在大型项目中以现代 CMake 方式添加 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53992748/

相关文章:

c++ - operator [] 在 vector 类上重载

Android - 将生成的 C 文件与 JNI 一起使用

CMAKE - 运行时库隐藏文件

c++ - C++ 项目的 CMake 文件

c++ - 纹理在 opengl 中显示为白色

c++ - 将 Symbian C++ 移植到 Android NDK

c++ - CMake 包支持 - 未找到包含和库

c++ - 为什么 'std::make_shared' 始终使用全局内存分配,即使类重载 new/delete 运算符也是如此?

c++ - 使用 SFINAE 检测编译器是否支持 std::atomic<std::shared_ptr<>>

c++ - 为什么将套接字绑定(bind)到接口(interface)失败?