2009-07-16 852 views
66

说我有一个C++项目被拆分成几个子项目。子项目都产生一个DLL,不同的开发团队在每个子项目上工作。现在,如果我想构建主项目,是否有办法避免自己构建所有子项目?C++的类似Maven的依赖管理?

简而言之,我正在寻找一些能够像Maven一样对Java进行依赖管理(即二进制文件和头文件)的方法。

实际上,我尝试过使用Maven,但这样做很麻烦,因为我必须手动创建软件包,而且相当频繁,Maven错过了选择最近的更改。另外,运行编译有点麻烦,因为我必须从Maven内部调用NAnt(我使用NAnt的功能直接构建Visual Studio解决方案)。

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

+0

使用挣钱的时候,问题是,我必须至少一次创造一切条件,因此还需要依赖的源文件。 特别是,在重建相关库时,它可能非常耗时且严重影响生产力。或者我错过了什么? – weberste 2009-07-16 08:54:52

回答

-1

我推荐使用所有构建依赖系统的母亲:make。

+0

我广泛使用它。 GCC可以制作'make'可以吃的依赖文件。够另一个答案,也许...... – Will 2009-07-16 08:45:25

+7

化妆其实是每个人都希望避免/看在构建-automation-系统 – chila 2012-03-26 18:15:10

5

如果您只需要依赖管理,请尝试Ivy,它与Ant很好地集成(并且我假定NAnt可以根据此blog,它从Ivy站点链接)执行相同操作。还有Byldan,一个.Net版本的Maven。不知道这对你有多好,尽管如此。

3

Make和GCC是一个非常好的依赖检查组合。例如,GCC可以自动生成“make”依赖文件(-MD命令行切换),以便能够重建依赖于给定报头的所有源文件。

我有我切正贴到我的makefile一些简单的规则:

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

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

现在,如果你的目标文件中说的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) 

当然,可以跟踪其他项目等的依赖关系,例如必要时重建共享库。

例如,如果你的其他团队始终把自己最新的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 
+0

看到我的评论附着于对我的关注与此解决方案 – weberste 2009-07-16 08:55:33

+0

的问题如果目标是依赖于另一个替换一下文件例如您的可执行文件依赖共享库,您可以为该共享库制定一个规则,确保您的库副本不需要源代码即可获得最新版本,例如通过简单地从特定位置获取最新副本或执行某些版本控制更新等。 – Will 2009-07-16 09:54:54

22

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

http://www.cmake.org/

我与它真的很好的经验。我最喜欢的是能够生产通用项目结构。因此,您可以一般地包含子项目查找单元测试等,而无需每次都更改脚本。

他们也有很多的模块如何找到预装建库,项目所需(如升压,QT等)


更新:在平均时间出现了一些努力,为C++引入包管理。

  • CMake的
  • 的Visual Studio
  • 的Makefile
  • 的XCode
  • ...
    • conan.io与主要的构建工具集成:一些值得考虑的项目cpm基于CMake
  • +7

    几个月前我用了CMake,事实上,检查预安装的库的工作非常好。但是,其他二进制依赖项(即来自我的子项目的依赖项)无法轻松管理。我错过了什么吗? – weberste 2009-07-20 13:06:55

    +2

    @weberste,实际上没有像C/C++这样的工具。开发人员尝试使用apt-get like工具处理依赖关系管理。 – SunnyShah 2015-02-02 15:06:19

    -5

    尝试scons,你会被迷住。制作过时,维护困难而且昂贵。

    +0

    我曾看过Scons,但没有找到管理二进制依赖关系的方法。你有这样的例子吗? – weberste 2009-07-20 13:05:45

    +1

    因为scons是python,所以你可以很容易地编写任何你想要管理你的二进制依赖关系的代码。也许在你的二进制依赖目录中有一个“SConscript”也有帮助。我不确定你在这里的要求是什么。 Pedro。 – piotr 2009-07-21 05:14:12

    1

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

    参见,NuGet for C++

    14

    对于依赖管理,它存在一个新的项目(这是一个创业公司),这是实现这种类型的工具:https://www.biicode.com/(一个C++依赖管理)。你可以添加你的依赖关系,它应该工作。

    目前,该项目的名称是conan.io,它们被JFrog收购。

    UPDATE:该项目是dead ...不幸的是,它似乎启动无法获得足够的优质付费用户,但服务器似乎是工作的罚款...

    UPDATE2:好像是有替代品项目:conan.io(感谢@mucaho)

    -1

    尝试SCons

    使用SCons是一个开放源码软件建设的工具,也就是说,下一代构建工具。可以将SCons看作改进的跨平台替代品,它具有类似于autoconf/automake和编译器缓存(如ccache)的集成功能的经典Make实用程序。总之,SCons是构建软件的一种更简单,更可靠,更快捷的方式。

    3

    最近公布:biicode开发商

    一个多平台的工具和托管服务

    编辑:

    比科德已被弃用

    备选:Conan.io

    0

    有许多工具坐在SCons之上,提供与Autotools类似的更高级别的功能,这些功能试图让开发人员的生活更轻松(例如。 WAF,SNOCS)。不幸的是,SCons本身存在主要缺点 - 大型项目的编译时间较长。

    我可以推荐尝试SNOCS(这是一个SCons的反向),对于那些你寻找一种简单的依赖管理,并在单个命令选择编译选项(编译器,在x86/x64,调试/发布,静态/共享库,测试/安装目标等)。

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

    CMake的的结构变得在一个较大的解决方案的繁琐,所以构建系统需要维护的显影时间的很大一部分。幸运的是,Martijn已经提到biicode这是“使用CMake生成你的项目的依赖”。

    2

    我建议conan,我用这些天。 在项目中维护所有相关库和二进制文件非常强大。