我正在为c ++游戏项目设置构建环境。我们的主要要求是不仅可以构建我们的游戏代码,还可以构建其依赖项(Ogre3D,Cegui,boost等)。此外,我们希望能够在Linux和Windows上构建,因为我们的开发团队由使用不同操作系统的成员组成。
Ogre3D使用CMake作为构建工具。这就是我们迄今为止将我们的项目建立在CMake上的原因。一旦在每个团队成员系统上手动设置所有依赖关系,我们就可以完全编译,因为CMake能够找到库。
问题是,是否有可行的方法来自动设置依赖项。作为一名Java开发人员,我知道Maven,但在c ++世界中确实存在哪些工具?
更新:感谢您的答案和链接。在接下来的几天里,我将尝试使用一些工具来查看符合我们要求的工具,从CMake开始。到目前为止,我确实已经与autotools分享了一些内容,并且我喜欢文档(这是一本非常好的读者),我担心autotools本身并不适合在Windows上使用。
有些人建议让某些IDE处理依赖关系管理。我们由使用所有可能技术的个人组成,从纯Vim到完全吹制Eclipse CDT或Visual Studio。这是CMake允许使用其生成本机项目文件的能力的地方。
答案 0 :(得分:7)
在最新的CMake 2.8版本中,有新的ExternalProject模块。 这允许下载/签出代码,配置和构建它作为主构建树的一部分。 它还应该允许设置依赖项。
在我的工作(医学图像处理小组)中,我们使用CMake构建我们自己的库和应用程序。我们有一个内部工具来跟踪项目之间的所有依赖关系(在XML数据库中定义)。大多数第三方库(如Boost,Qt,VTK,ITK等)都为我们支持的每个系统(MSWin32,MSWin64,Linux32等)构建一次,并在版本控制系统中作为zip文件提交。然后,CMake将根据开发人员正在使用的系统提取和配置正确的zip文件。
答案 1 :(得分:5)
过去几个月我一直在使用GNU Autotools(Autoconf,Automake,Libtool)参与我参与的几个项目,我认为它的工作非常精彩。说实话,它确实需要一点点习惯语法,但我已成功地在需要分发python脚本,C库和C ++应用程序的项目上使用它。当我第一次在这里问一个类似的问题时,我会给你一些帮助我的链接。
更多链接:
我不确定的一件事是GNU Autotools的任何类型的Windows包装器。我知道您可以在Cygwin中使用它,但至于在Windows平台上实际分发文件和依赖项,您可能最好使用Windows MSI安装程序(或者可以在Visual Studio中打包项目的东西)。
如果要分发依赖项,可以在不同的子目录下设置它们,例如 libzip ,并使用特定的Makefile.am条目构建该库。执行 make install 时,库将安装到配置脚本确定应使用的 lib 文件夹中。
祝你好运!答案 2 :(得分:2)
有几个有趣的make替换可以自动跟踪隐式依赖项(来自头文件),是跨平台的,可以处理生成的文件(例如着色器定义)。我过去使用的两个示例是SCons和Jam / BJam。
我不知道让* make自动跟踪依赖关系的跨平台方式。 您可以做的最好的事情是使用一些扫描源文件的脚本(或者让C ++编译器这样做)并找到#includes(条件编译使得这很棘手)并生成makefile的一部分。 但是,只要有可能发生变化,你就需要调用这个脚本。
答案 3 :(得分:2)
问题是,是否有可行的方法来自动设置依赖项。
你的意思是什么?
正如你所说,一旦依赖关系在机器上,CMake将编译所有内容。您是否只是在寻找一种打包依赖源的方法?一旦所有源都存在,就可以使用CMake和构建工具(gcc,nmake,MSVS等)。
编辑:旁注,CMake有文件命令,可以在需要时下载文件:file(DOWNLOAD url file [TIMEOUT timeout] [STATUS status] [LOG log])
编辑2:CPack是CMake家伙的另一个工具,可用于打包文件等,以便在各种平台上进行分发。它可以为Windows创建NSIS,为* nix创建.deb或.tgz文件。
答案 4 :(得分: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构建系统中有一些非常好的东西,这有助于他让整个过程顺利构建。
答案 5 :(得分:1)
在许多* nix系统上,使用某种包管理器或构建系统。最常见的源代码是GNU Autotools,我听说这是极度悲痛的根源。但是,通过几个脚本和一个在线存储库,您可以设置类似的东西:
touch
进行此操作,但您可以更加彻底)curl
等来下载dep make; make install; make clean;
等)。如果dep已经构建并安装,make将会很快返回。根据每个dep的安装程序(可能是安装程序是交互式的?),会有很多极端情况会导致这种情况破坏,但这种方法应该涵盖一般的想法。
答案 6 :(得分:0)
现在我正在开发一种工具,能够自动安装具有确切版本要求的C / C ++应用程序的所有依赖项:
现在它适用于我的应用程序。 (按正确顺序安装UnitTest ++,Boost,Wt,sqlite,cmake)
这个名为“C ++版本管理器”的工具(灵感来自优秀的ruby版本管理器),用bash编码并托管在github上:https://github.com/Offirmo/cvm
欢迎任何意见和建议。