【问题标题】:Including pre-compiled libraries in source tree在源代码树中包含预编译的库
【发布时间】:2010-10-07 02:58:54
【问题描述】:

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

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

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

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

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

我的问题是:

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

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

  3. 您建议采用何种文件夹组织来考虑多个平台(Windows、Mac OSX 和 Linux)?

补充说明:我们正在使用 Mercurial。

【问题讨论】:

标签: version-control libraries code-organization


【解决方案1】:

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

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

除此之外,我已经看到它完成了,并且看到了它的工作。

【讨论】:

  • 感谢您提醒存储库随着库的频繁更新而变得越来越大。
【解决方案2】:

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

  • 既然您谈到构建依赖项,您打算如何确保编译后的代码可以在开发人员的机器上运行?我怀疑 Windows 代码能否在 Os X 下运行,甚至可能无法在 Debian Linux 下运行 Fedora Linux Rawhide。

  • 如果我已经在我的系统上安装了依赖项,我如何才能完全禁用您的版本的安装?我为什么要在结帐时下载它们?

  • 如果您打算将此代码放入某些 Linux 发行版打包程序中,您会因引入的紧密耦合而烦恼,因为在共享库运行良好的 Linux 世界中不太需要您的方法。

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

【讨论】:

  • 谢谢,你指出了一些我不知道的特定于 Linux 的问题,因为我更像是一个 Windows 人。
  • 有一件事我忘了提:这不是一个开源项目。因此,唯一致力于它的开发人员是我们的 3 人团队。但是您关于共享库在 Linux 上受到青睐的观点确实是我们需要牢记的。
猜你喜欢
  • 2011-06-26
  • 1970-01-01
  • 2012-03-11
  • 1970-01-01
  • 2013-01-12
  • 1970-01-01
  • 2021-11-08
  • 2011-02-06
  • 1970-01-01
相关资源
最近更新 更多