6

我正在为 C++ 游戏项目设置构建环境。我们的主要要求是不仅能够构建我们的游戏代码,还能够构建它的依赖项(Ogre3D、Cegui、boost 等)。此外,我们希望能够在 Linux 和 Windows 上构建,因为我们的开发团队由使用不同操作系统的成员组成。

Ogre3D 使用CMake作为其构建工具。这就是为什么到目前为止我们的项目也基于 CMake。一旦在每个团队成员系统上手动设置了所有依赖项,我们就可以完美编译,因为 CMake 能够找到库。

问题是是否有一种可行的方法来自动设置依赖项。作为一名 Java 开发人员,我知道 Maven,但 C++ 世界中确实存在哪些工具?


更新:感谢您提供好的答案和链接。在接下来的几天里,我将尝试一些工具来看看满足我们的要求,从 CMake 开始。到目前为止,我确实与 autotools 分享过,而且我非常喜欢文档(autobook 非常好读),但我担心 autotools 并不打算在 Windows 上原生使用。

你们中的一些人建议让一些 IDE 处理依赖关系管理。我们由个人组成,他们使用所有可能的技术来编写从纯 Vim 到成熟的 Eclipse CDT 或 Visual Studio 的代码。这是 CMake 允许使用一些灵活性的地方,它能够生成本机项目文件。

4

7 回答 7

7

在最新的 CMake 2.8 版本中,有新的ExternalProject模块。这允许下载/签出代码、配置和构建它作为主构建树的一部分。它还应该允许设置依赖项。

在我的工作(医学图像处理组)中,我们使用 CMake 构建我们自己的所有库和应用程序。我们有一个内部工具来跟踪项目之间的所有依赖关系(在 XML 数据库中定义)。大多数第三方库(如 Boost、Qt、VTK、ITK 等)为我们支持的每个系统(MSWin32、MSWin64、Linux32 等)构建一次,并在版本控制系统中以 zip 文件的形式提交。然后,CMake 将根据开发人员正在使用的系统提取并配置正确的 zip 文件。

于 2009-12-05T14:37:26.903 回答
4

在过去的几个月里,我在参与的几个项目中一直在使用 GNU Autotools(Autoconf、Automake、Libtool),我认为它运行良好。说实话,习惯语法确实需要一点时间,但我已经在一个需要分发 python 脚本、C 库和 C++ 应用程序的项目中成功使用它。当我第一次在这里提出类似问题时,我会给你一些帮助我的链接。

更多链接:

  1. http://www.lrde.epita.fr/~adl/autotools.html
  2. http://www.developingprogrammers.com/index.php/2006/01/05/autotools-tutorial/
  3. http://sources.redhat.com/autobook/

我不确定的一件事是 GNU Autotools 的任何类型的 Windows 包装器。我知道您可以在 Cygwin 中使用它,但至于在 Windows 平台上实际分发文件和依赖项,您最好使用 Windows MSI 安装程序(或可以将您的项目打包到 Visual Studio 中的工具)。

如果要分发依赖项,可以将它们设置在不同的子目录下,例如libzip,并使用将构建该库的特定 Makefile.am 条目。当您执行make install时,该库将安装到配置脚本确定它应该使用的lib文件夹中。

祝你好运!

于 2009-12-01T18:21:17.097 回答
2

有几个有趣的 make 替换可以自动跟踪隐式依赖项(来自头文件),是跨平台的并且可以处理生成的文件(例如着色器定义)。我曾经使用的两个示例是SConsJam / BJam

我不知道让 *make 自动跟踪依赖项的跨平台方法。您可以做的最好的事情是使用一些脚本来扫描源文件(或让 C++ 编译器这样做)并找到#includes(条件编译使这很棘手)并生成部分makefile。但是,当某些事情可能发生变化时,您需要调用此脚本。

于 2009-12-01T18:17:38.227 回答
2

问题是是否有一种可行的方法来自动设置依赖项。

设置是什么意思?

正如您所说,一旦依赖项在机器上,CMake 将编译所有内容。您是否只是在寻找一种打包依赖源的方法?一旦所有的源代码都在那里,CMake 和构建工具(gcc、nmake、MSVS 等)就足够了。

编辑:旁注,CMake 有 file 命令,可用于在需要时下载文件:file(DOWNLOAD url file [TIMEOUT timeout] [STATUS status] [LOG log])

编辑 2:CPack是 CMake 人员的另一个工具,可用于打包文件等,以便在各种平台上分发。它可以为 Windows 创建 NSIS,为 *nix 创建 .deb 或 .tgz 文件。

于 2009-12-01T18:25:40.393 回答
2

在我的工作地点(我们构建用于电源保护的嵌入式系统),我们使用 CMake 来解决问题。我们的设置允许从不同位置运行 cmake。

/
CMakeLists.txt "install precompiled dependencies and build project"
   project/
      CMakeLists.txt "build the project managing dependencies of subsystems"
      subsystem1/
         CMakeLists.txt "build subsystem 1 assume dependecies are already met"
      subsystem2/
         CMakeLists.txt "build subsystem 2 assume dependecies are already met"

诀窍是确保每个 CMakeLists.txt 文件都可以单独调用,但顶级文件仍然可以正确构建所有内容。从技术上讲,我们不需要子 CMakeLists.txt 文件,但它让开发人员很高兴。如果我们都必须在项目的根目录编辑一个整体构建文件,那将是绝对痛苦的。

我没有设置系统(我提供了帮助,但它不是我的孩子)。作者说 boost cmake 构建系统里面有一些非常好的东西,可以帮助他顺利地构建整个东西。

于 2009-12-01T22:35:25.400 回答
1

在许多 *nix 系统上,为此使用了某种包管理器或构建系统。最常见的源代码是 GNU Autotools,我听说它是​​极度悲痛的根源。但是,您可以使用一些脚本和一个在线存储库为您的部门设置类似的内容:

  • 在您的项目 Makefile 中,创建一个涵盖您的依赖项的目标(可以选择包含子目标)。
  • 在每个依赖项的目标中,首先检查 dep 源是否在项目中(在 *nix 上你可以使用touch它,但你可以更彻底)
  • 如果没有dep,可以使用curl,等下载dep
  • make; make install; make clean;在所有情况下,让 dep 目标对依赖项的 Makefile(或其他配置脚本/构建文件)进行递归调用(等)。如果 dep 已经构建和安装,make 将很快返回。

但是,根据每个部门的安装程序(也许安装程序是交互式的?),将会有很多极端情况会导致这种情况中断,但是这种方法应该涵盖一般的想法。

于 2009-12-01T18:04:56.037 回答
0

现在,我正在开发一种工具,该工具能够自动安装具有确切版本要求的 C/C++ 应用程序的所有依赖项:

  • 编译器
  • 工具(cmake、autotools)

现在它适用于我的应用程序。(以正确的顺序安装 UnitTest++、Boost、Wt、sqlite、cmake)

该工具名为 «C++ 版本管理器»(灵感来自优秀的 ruby​​ 版本管理器),使用 bash 编码并托管在 github 上:https ://github.com/Offirmo/cvm

欢迎任何意见和建议。

于 2013-01-10T17:42:40.763 回答