如何正确管理C / C ++项目的依赖关系?


11

我有一个使用3-4个不同的开源C / C ++库的项目。

我为多个平台构建了这些库,并在我的项目中检入了针对不同平台的包含文件和静态库。

但是,我遇到了两个问题。所有这些项目都与依赖项管理有关。我正在寻找最佳实践建议。

1)我怎么知道我到底使用什么?

我没有办法获得静态库的版本。结果,我需要以某种方式跟踪我正在使用哪个版本的静态库(可能是生成它的提交的SHA)?

当我需要确定何时升级这些库时,这一点尤其重要。

2)如何复制构建?

我可能很难为特定平台构建一些特定库。我花了一段时间才弄清楚。

下次需要构建相同的库可能需要半年时间(无论出于何种原因都需要升级。但是,到那时,我绝对不会记住任何东西以及构建它的环境将早已不复存在。

3)我应该分叉这些库以获取源代码的副本吗?

这是一个较小的问题。但是,这仍然是一个问题。确保构建是可复制的(这需要源代码)是一件很高兴的事。

Answers:


5

您是否真的需要始终使用依赖库的确切版本?版本每增加一点,它写的不好/是否破坏了它的API?

如果您查看开源项目,它们的构建configure脚本(主要是部分脚本)将检查是否存在各种库,如果不存在,则会引发错误。它也足够灵活,允许用户链接到该库的较新版本(该库可能比较旧的库提供更多的错误/安全修复程序),并且不执行静态或动态链接。

如果您确实需要可复制的内部版本,则还应注意编译器的确切版本及其标准库,甚至可能是操作系统。在这种情况下,我认为拥有一台具有所需确切环境的构建机器比在源代码存储库中检入已编译的库要好。


2
我认为我不需要使用确切的版本。但是,我需要知道我正在使用哪一个。例如,如果有人发现OpenSSL 1.1.0b具有巨大的漏洞,我最好知道我使用的是OpenSSL 1.1.0b还是1.1.0c
Victor Ronin

关于构建的可复制性,这可能是我的第二要考虑的问题。
维克多·罗宁

3

我怎么知道我到底使用什么?

如果include文件或libs文件尚未包含版本号,请自行将文本文件“ version.txt”(包含版本号)添加到每个lib文件夹,并将其与lib和include文件一起检入VCS 。但是,如果对lib的完整源进行版本控制(第3点),则很有可能已经存在包含版本号的源代码文件,因此在这种情况下无需维护您自己的源代码。

我如何复制构建?

尝试尽可能地自动化。使用脚本,makefile或您喜欢的构建工具的文件。将所有这些置于源代码控制之下。如果需要手动步骤,请将详细信息写到文本文件(例如readme_build.txt)中,并将其置于源代码控制之下。

我应该分叉这些库以获取源代码的副本吗?

您应该拥有源代码副本,但仅在必要时才进行分叉(例如,如果您遇到了紧急错误,并且原始作者无法在您的时间限制内进行修复)。或者,如果作者使用的编译环境与您不同,则必须进行一些更改以使lib在您的环境中工作。但是,请注意,您对fork中的原始源代码进行的每次更改很可能使以后更难集成更新。

尽管如此,我还是建议您获取正在使用的库的原始(未分叉)源代码的副本。即使原始维护者决定撤消公共网站上的lib资源,这也将允许您在以后有需要时分叉或维护lib。


因此,答案是“手动执行此操作” :)我希望有人会说...哦...有一个用于该工具的工具:)当您说“复制源代码”时,您的意思是,只需获得一个tar文件与源并将其转储到源代码管理中?
维克多·罗宁

1
@VictorRonin:不,答案是“让您的VCS处理它可以为您做的所有事情”,以及“使用标准构建工具尽可能多地自动化”。您是选择特定版本的人,是需要定义构建步骤,链接并包含您环境的参考的人。为体现这些despendencies标准程序是通过脚本,生成文件,项目文件等
布朗博士

...以及如何获取lib或库的源代码取决于维护者/供应商如何提供它。也许是一个tar球,也许是通过直接访问git hub,或者是一个nuget包。
布朗
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.