关于如何构造c++项目并使用CMake (在CLion内部)构建该项目,我有一个问题。我对c++ (两周前才开始学习该语言)和CMake (我从未配置过CMake文件)非常陌生。不过,我确实对其他编程语言及其生态系统(如Java、JavaScript、Php和.NET)有丰富的经验--与这些生态系统进行类比可能会有帮助吗?
我们正在为一个学校项目建立我们自己的(小的,2d)游戏和游戏引擎。游戏引擎应该是独立的,游戏应该建立在我们自己的引擎上。引擎将有自己的依赖项(使用SDL2构建,这是一个要求)。
我设想引擎将成为一个(静态)库,而实际的游戏将编译成依赖于引擎库的可执行文件。
为了简化项目管理,我们希望将引擎和游戏代码存放在同一个git存储库中。
考虑到我们可能希望在引擎中添加一个math模块(可能不是这种情况,而是为了解决这个问题),我设想一个文件夹结构,如下所示:
our-project/
├── README.md
├── engine
│ ├── src
│ │ ├── math.cpp
│ │ └── math.h
│ └── test
│ └── ...
└── game
├── src
│ └── main.cpp
└── test
└── ...然后引擎将包含以下代码:
// in math.h
namespace engine::math {
int add(int a, int b);
}
// in math.cpp
#include "math.h"
namespace engine::math {
int add(int a, int b) {
return a + b;
}
}假设我们想要使用游戏中的这个引擎代码,我想象下面的代码:
// in game/main.cpp
#include <iostream>
#include "engine/math.h"
using namespace engine;
int main() {
std::cout << math::add(10, 1) << std::endl;
}问题
发布于 2020-09-16 09:04:54
engine/src/CMakeLists.txt中:add_library(engine math.cpp)
在game/src/CMakeLists.txt期间,您已经
Add_executable(我的游戏main.cpp) target_link_libraries(我的游戏专用引擎)
在使用例如make时,您可以通过以下方式单独构建目标
使引擎#只生成引擎,而不是可执行的使我的游戏#生成引擎(如果需要),然后生成可执行文件。
单独的测试目标也是有意义的。
(引擎接口${CMAKE_CURRENT_SOURCE_DIR})
上面的设置将包含目录传播到所有链接到引擎的目标。这很简单,但有一个缺点:您无法区分公共标题和实现细节。作为另一种选择,您可以有一个目录engine/src/public/engine,其中包含游戏应该使用的所有公共标题:
Target_include_directories(引擎接口${CMAKE_CURRENT_SOURCE_DIR}/public) target_include_directories(引擎私有${CMAKE_CURRENT_SOURCE_DIR}/public/engine)
这样,game中的客户端代码使用#include "engine/math.h",而在engine中,您可以只使用#include "math.h"。我喜欢这样的设置,因为它很容易看到,库的接口是什么,它的实现是什么。但这也有一定的味觉。--
https://stackoverflow.com/questions/63916507
复制相似问题