类似于Maven的C ++依赖管理?[关闭]


94

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

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

实际上,我试图为此使用Maven,但这非常麻烦,因为我不得不手动且非常频繁地创建软件包,Maven错过了最新的更改。另外,运行编译有点麻烦,因为我必须从Maven内部调用NAnt(我使用NAnt的功能直接构建Visual Studio解决方案)。

有关如何执行此操作的任何提示和想法?


使用make时的问题是,我必须至少构建一次所有内容,因此还需要依赖项的源文件。特别是,当重建依赖库时,这将非常耗时并且严重影响生产率。还是我错过了什么?
weberste

3
这似乎是一个有用的问题。也许可以将此问题移植到更欢迎这些问题的其他站点?我正在寻找c ++依赖管理的最佳实践。
simgineer

这大约晚了10年,所以这里有3种可能性:您滥用maven,您错过了全部要点maven,或者10年前当我不使用mavenC ++时,它对C ++的用处远不如以前。我不能说2009年,但是根据最近几年的经验,maven这正是您要描述的问题所用的语言。它完全可以满足您的需求,并且效率高,性能好,并且不会做您声称要做的负面事情。在2019年或以后阅读此书的任何人都应强烈考虑maven为此目的使用。
searchengine27

Answers:


37

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

http://www.cmake.org/

我真的有很好的经验。我最喜欢的是生成通用项目结构的能力。因此,您通常可以包含子项目查找以进行单元测试等,而无需每次都更改脚本。

他们还有很多模块,用于查找项目所需的预装构建库(例如Boost,QT等)。


更新:同时,我们付出了一些努力来引入C ++的软件包管理。一些值得关注的项目:

  • conan.io与主要的构建工具集成:
    • CMake的
    • 视觉工作室
    • 生成文件
    • XCode
    • ...
  • CPM基于CMake的( CPM没有被积极维护。)
  • 巴卡鲁

注意,通过在评论CPM @RAM指出的是不再是积极维护。


7
几个月前,我使用了CMake,确实,检查预安装的库工作非常好。但是,其他二进制依赖项(即来自我的子项目的二进制依赖项)无法轻松管理。我想念什么吗?
weberste

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

1
cpm并未得到积极维护,自2015年初以来已经死亡
RAM

@RAM:感谢您指出这一点。我在帖子中添加了一个注释,供您参考。
ovanes

2
CMake是一个构建系统,其查找依赖项的能力有限。这不是在NPM,货运等意义上的依赖管理
sdgfsdh

17

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

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

更新:该项目已死...不幸的是,这家初创公司似乎无法获得足够的优质付费客户,但服务器似乎运行良好...

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


我可以删除链接..该项目已关闭,现在是conan.io
carlos.baez,

感谢更新!我主要只是出于好奇,看起来仍然可以在他们的github上寻找文档;它可能一点也不像网站上的那样好,但我想总比没有好。只是想知道,conan.io只是一个品牌重塑还是完全不同的产品?
jrh

1
它不是重新命名,而是一个从头开始的全新项目,它具有所有经验教训:完全开源,内部服务器完全分散,支持所有构建系统,管理二进制文件。
drodri

8

我建议使用以下高级构建系统:


Maven Nar插件获得了良好的支持。我用过,到目前为止我很喜欢。但是,您需要了解,Maven不适合用于单存储库。大多数C ++解决方案都需要Mono仓库句柄共享库等。
汉斯

5

如果仅需要依赖项管理,请尝试Ivy,它可以与Ant很好地集成(并且我认为NAnt可以基于此博客(从Ivy站点链接到该站点)进行相同的操作)。

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


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

请参阅我对与此解决方案有关的问题的评论
weberste

如果目标依赖于另一个文件,例如您的可执行文件依赖于共享库,则可以为该共享库制定一条规则,以确保您的库副本是最新的而不需要源文件,例如,只需获取来自特定位置或执行某些版本控制更新之类的最新副本。
威尔

${CC} ${CFLAGS} -c $< -MD -MF $(<:%.c=%.dep) -o $@我很难解析所有这些Make符号,这看起来可以解决类似g++ -c main.cc -MD -MF test您要在命令行上独立运行的问题,并将结果放入名为“ test”的文件中。
jrh



1

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

另请参阅NuGet for C ++


1
的NuGet是一个Visual Studio扩展
Toughy

@Toughy,它也可以用作独立的依赖项管理。(4M可执行文件)
Yousha Aleayoub

0

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

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

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

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


-1

尝试SCons

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


3
SCons没有任何内置的依赖关系管理或类似要求的存储库。
Maxime Viargues 2015年

-3

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


我广泛使用它。GCC可以制作“ make”可以吃的依赖文件。够另一个答案,也许...
威尔

8
make实际上是每个人都希望通过查看build
-automation-

-6

尝试使用scons,您将上瘾。Make已过时,维护困难且昂贵。


我查看了Scons,但没有找到管理二进制依赖项的方法。你有一个例子吗?
weberste

1
由于scons是python,因此您可以编写任何代码来轻松管理二进制依赖项。也许在二进制依赖目录中有一个“ SConscript”也有帮助。我不确定您对此有何要求。佩德罗
piotr

16
因此,您建议根据“我不确定您需要什么,但可以使用Python自己编程”的工具。那你为什么需要斯康呢?
jalf
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.