103

假设我有一个 C++ 项目,该项目分为几个子项目。子项目都生成一个 DLL,并且不同的开发团队在每个子项目上工作。现在如果我想构建主项目,有没有办法避免自己构建所有子项目?

简而言之,我正在寻找以与 Maven 对 Java 类似的方式进行依赖管理(即二进制文件和头文件)的东西。

实际上,我尝试为此使用 Maven,但这相当麻烦,因为我必须手动且非常频繁地创建包,Maven 错过了获取最新更改的机会。此外,运行编译有点麻烦,因为我必须从 Maven 中调用 NAnt(我使用 NAnt 的功能直接构建 Visual Studio 解决方案)。

关于如何做到这一点的任何提示和想法?

4

12 回答 12

41

初步答案:我建议使用 CMake。它是一个多平台的 make 文件生成器(也可以生成 Visual Studio 或 Eclipse CDT 项目)。

http://www.cmake.org/

我对它的体验真的很好。我最喜欢它的地方在于能够生成通用项目结构。因此,您通常可以包含用于单元测试等的子项目查找,而无需每次都更改脚本。

他们还有很多关于如何找到项目所需的预安装构建库的模块(如 Boost、QT 等)


更新:同时有一些努力为 C++ 引入包管理。一些值得关注的项目:

  • conan.io与主要构建工具集成:
    • 制作
    • 视觉工作室
    • 生成文件
    • 代码
    • ...
  • cpm基于 CMake(注意CPM 没有得到积极维护。)
  • 巴卡鲁

正如@RAM在评论中指出的那样,cpm 不再被积极维护。

于 2009-07-16T10:13:48.287 回答
18

对于依赖管理,它存在一个正在实现此类工具的新项目(它是一家初创公司):https ://github.com/biicode (一个 C++ 依赖管理器)。您可以添加您的依赖项,它应该可以工作。

目前,该项目名为conan.io,已被JFrog收购。

更新:这个项目已经死了......不幸的是,这家初创公司似乎无法获得足够的付费客户,但服务器似乎工作正常......

UPDATE2:似乎有一个替代项目:conan.io(感谢@mucaho)

于 2014-06-25T12:09:51.697 回答
8

我推荐以下高级构建系统:

于 2014-09-23T08:24:37.913 回答
5

如果您只想要依赖管理,请尝试Ivy,它与 Ant 很好地集成(我假设 NAnt 可以根据这个博客做同样的事情,该博客链接自 Ivy 站点)。

还有Byldan,一个 .Net 版本的 Maven。不知道这对你有多好。

于 2009-07-16T08:10:16.710 回答
3

Make 和 GCC 是非常好的依赖检查组合。

例如,GCC 可以自动生成“make”依赖文件(-MD 命令行开关),以便能够重建所有依赖于给定头文件的源文件。

我有一些简单的规则可以剪切并粘贴到我的 makefile 中:

# compile c files   
%.o:    %.c
    ${CC} ${CFLAGS} -c $< -MD -MF $(<:%.c=%.dep) -o $@

# compile c++ files
%.opp:  %.cpp
    ${CPP} ${CPPFLAGS} -c $< -MD -MF $(<:%.cpp=%.dep) -o $@

现在,如果您的目标文件在 OBJ_C 和 OBJ_CPP 列表中声明:

.PHONY: cleandep
cleandep:
    rm -f $(OBJ_C:%.o=%.dep) $(OBJ_CPP:%.opp=%.dep)

-include $(OBJ_C:%.o=%.dep) $(OBJ_CPP:%.opp=%.dep)

Make 当然可以跟踪与其他项目的依赖关系等,例如,也可以根据需要重建共享库。

例如,如果您的其他团队总是将他们最新的 DLL 放在某个共享文件夹中:

myapp: ${SRC_CPP} ${LIB_DIR}other_team.lib
  ...

${LIB_DIR}other_team.lib: /shared_folder/latest/other_team.lib
  cp /shared_folder/latest/other_team.lib ${LIB_DIR}other_team.lib
于 2009-07-16T08:51:59.340 回答
3

编辑:

不推荐使用 Biicode

替代方案: Conan.io

于 2015-01-12T13:51:17.487 回答
2

我推荐conan,这些天我正在使用它。维护项目中的所有依赖库和二进制文件非常强大。

于 2016-11-03T05:58:10.220 回答
1

您可以为使用过的库创建 NuGet 包,并使用 NuGet 进行依赖项管理。

另请参阅适用于 C++ 的 NuGet

于 2014-01-14T13:29:28.487 回答
0

有许多工具位于 SCons 之上,提供类似于 Autotools 的更高级别的功能,它们试图让开发人员的生活更轻松(例如 WAF、SNOCS)。不幸的是,SCons 本身有一个主要缺点——大型项目的编译时间较长。

对于那些寻求简单的依赖管理并在单个命令(编译器、x86/x64、调试/发布、静态/共享库、测试/安装目标等)。

SNOCS 还尝试通过将项目配置输出存储在单独的文件中来解决编译时间长的问题,这允许后续构建完全跳过配置阶段并直接进入构建阶段(最后一个功能现在正在构建中)

CMake 的配置在较大的解决方案中变得乏味,因此构建系统维护需要开发人员的大部分时间。幸运的是,正如 Martijn 已经提到的那样,有biicode “使用 CMake 生成您的项目及其依赖项”。

于 2015-08-24T14:01:26.173 回答
-1

试试SCons

SCons 是一种开源软件构建工具,即下一代构建工具。将 SCons 视为经典 Make 实用程序的改进的跨平台替代品,具有类似于 autoconf/automake 和编译器缓存(如 ccache)的集成功能。简而言之,SCons 是一种更简单、更可靠、更快速的软件构建方式。

于 2014-06-30T13:47:42.980 回答
-5

我建议使用所有构建依赖系统之母:make。

于 2009-07-16T07:56:42.573 回答
-6

试试scons,你会被迷住的。Make 已过时、维护困难且成本高昂。

于 2009-07-16T11:24:34.823 回答