2010-10-07 63 views
0

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

目前,我们的源代码树是这个样子:

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

当检查出的代码,开发者首先生成并安装“一些库”和“其他库”。安装步骤会将正确的文件放入include和lib文件夹,然后他们可以构建我们的项目。

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

我的问题是:

  1. 它是一个不好的做法,这样做呢? (即:将预编译的库包括到您的源代码树中)。

  2. 什么潜在的问题/缺点可以从这个设置产生的?

  3. 对于几个平台(Windows,Mac OSX和Linux),您建议考虑哪个文件夹组织?

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

+2

可能的重复[可以(应该)我把第三方库在版本控制?](http://stackoverflow.com/questions/1710027/can-should-i-put-3rd-party-libraries-in-版本控制) – durron597 2015-09-16 18:05:11

回答

1

我对此断然拒绝,以保持的二进制文件的旧版本的版本控制系统的工作。那是很久以前的事了,我认为这对目前的VCS来说不是问题,但在实现这个想法之前请先检查一下。

如果第三方库得到更新的频率,你的资料库可能会相当大。

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

+0

感谢关于存储库日益增多的频繁库更新的提醒。 – gregschlom 2010-10-07 03:11:30

1

好,你正努力成为跨平台的,但你的源捆绑依赖带有多个问题。

  • 既然你说说建筑的依赖关系,你如何打算,以确保编译后的代码可以在开发人员的机器上运行?我怀疑Windows代码将在OS X下运行,甚至可能不是Debian Linux下的Fedora Linux Rawhide。

  • 如果我已经有我的系统上安装的依赖关系,我怎么能干净地禁用在安装您的版本?为什么我会关心在退房时下载它们?

  • 如果您打算将此代码加入某些Linux发行版中,打包程序会对您所引入的紧密耦合产生影响,因为您的方法在共享库工作得很好的Linux世界中不太需要。

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

+0

谢谢,您指出了一些我不知道的特定于Linux的问题,他们更像是一个Windows用户。 – gregschlom 2010-10-07 06:16:29

+0

我忘了提一件事:这不是一个开源项目。所以唯一的开发人员是我们的团队3.但是您关于共享库在Linux上受青睐的观点确实是我们需要牢记的事情。 – gregschlom 2010-10-07 06:18:40