在源代码树中包含预编译的库

时间:2010-10-07 02:58:55

标签: version-control libraries code-organization

我有一个跨平台的C ++项目。在这个项目中,我们使用了几个非常庞大且不易构建的第三方静态编译库。

目前,我们的源代码树如下所示:

|
+-3rdparty
| +-include   (initially empty)
| +-lib       (initially empty)
| +-some-library
| +-another-library
|
+-source

签出代码时,开发人员首先会构建并安装“some-library”和“another-library”。安装步骤会将正确的文件放入include和lib文件夹,然后他们就可以构建我们的项目。

为了使我们的项目更容易构建,我想要删除“some-library”和“another-library”,而只是将includes和预编译的二进制文件放入include和lib文件夹中。这样,新的开发人员只需要检查项目,并立即构建它。

我的问题是:

  1. 这样做是不好的做法? (即:将预编译的库包含在源代码树中)。

  2. 此设置可能会产生哪些潜在问题/缺点?

  3. 您建议在多个平台(Windows,Mac OSX和Linux)上使用哪种文件夹组织?

  4. 附加说明:我们正在使用Mercurial。

2 个答案:

答案 0 :(得分:1)

我使用的版本控制系统绝对拒绝保留旧版本的二进制文件。这是很久以前的事了,我不认为这对任何现有的VCS来说都是一个问题,但在实现这个想法之前要检查一下。

如果第三方库经常更新,您的存储库可能会变得非常大。

除此之外,我已经看到它已经完成,并且看到它有效。

答案 1 :(得分:1)

很好,您正在尝试跨平台,但将依赖项与源捆绑在一起会带来多个问题。

  • 由于您谈到构建依赖项,您如何计划确保已编译的代码可以在开发人员的计算机上运行?我怀疑Windows代码是否会在Os X下运行,甚至可能不是Debian Linux下的Fedora Linux Rawhide。

  • 如果我的系统上已安装了依赖项,如何干净地禁用版本的安装?为什么我会在结账时下载它们?

  • 如果你计划将这些代码放到一些Linux发行版中,那么你会对你所引入的紧密耦合产生误解,因为在共享库工作得很好的Linux世界中你不需要这种方法。

    < / LI>

当然,你的方法是在许多地方,无论大小,但为什么要重复他们的错误?如果您确实需要为开发人员提供安装这些依赖项的快捷方式,则应编写可配置脚本,将依赖项安装到某些前缀中。并添加一些标志以禁用安装特定依赖项。