首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于库和可执行文件的c++ CMake项目结构

用于库和可执行文件的c++ CMake项目结构
EN

Stack Overflow用户
提问于 2020-09-16 08:53:02
回答 1查看 1.3K关注 0票数 2

关于如何构造c++项目并使用CMake (在CLion内部)构建该项目,我有一个问题。我对c++ (两周前才开始学习该语言)和CMake (我从未配置过CMake文件)非常陌生。不过,我确实对其他编程语言及其生态系统(如Java、JavaScript、Php和.NET)有丰富的经验--与这些生态系统进行类比可能会有帮助吗?

我们正在为一个学校项目建立我们自己的(小的,2d)游戏和游戏引擎。游戏引擎应该是独立的,游戏应该建立在我们自己的引擎上。引擎将有自己的依赖项(使用SDL2构建,这是一个要求)。

我设想引擎将成为一个(静态)库,而实际的游戏将编译成依赖于引擎库的可执行文件。

为了简化项目管理,我们希望将引擎和游戏代码存放在同一个git存储库中。

考虑到我们可能希望在引擎中添加一个math模块(可能不是这种情况,而是为了解决这个问题),我设想一个文件夹结构,如下所示:

代码语言:javascript
复制
our-project/
├── README.md
├── engine
│   ├── src
│   │   ├── math.cpp
│   │   └── math.h
│   └── test
│       └── ...
└── game
    ├── src
    │   └── main.cpp
    └── test
        └── ...

然后引擎将包含以下代码:

代码语言:javascript
复制
// 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;
    }
}

假设我们想要使用游戏中的这个引擎代码,我想象下面的代码:

代码语言:javascript
复制
// in game/main.cpp
#include <iostream>
#include "engine/math.h"

using namespace engine;

int main() {
    std::cout << math::add(10, 1) << std::endl;
}

问题

  1. 如何设置CMake,以便既可以单独构建引擎(静态库),又可以构建依赖于同一引擎的游戏(可执行文件)?
  2. 应该如何管理引擎头文件?我如何使他们可以访问游戏代码?我应该对头文件使用不同的结构吗?
  3. 这个文件夹结构可管理吗?我应该考虑一种不同的方法吗?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-16 09:04:54

  1. 您声明了单独的CMake目标,即在engine/src/CMakeLists.txt中:

add_library(engine math.cpp)

game/src/CMakeLists.txt期间,您已经

Add_executable(我的游戏main.cpp) target_link_libraries(我的游戏专用引擎)

在使用例如make时,您可以通过以下方式单独构建目标

使引擎#只生成引擎,而不是可执行的使我的游戏#生成引擎(如果需要),然后生成可执行文件。

单独的测试目标也是有意义的。

  1. 包含CMake中的标志如下所示。

(引擎接口${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"。我喜欢这样的设置,因为它很容易看到,库的接口是什么,它的实现是什么。但这也有一定的味觉。--

  1. 再次固执己见。但我认为这是一个很好的目录结构。坚持下去。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63916507

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档