我正在从事一个包含基于 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/