我们公司也遇到过类似的问题。在构建环境中管理 boost 版本绝非易事。拥有 10 多个开发人员,他们都在自己的系统上进行编码,您将需要某种自动化。
首先,我认为在 SVN 或任何 SCM 系统中存储大型库的副本并不是一个好主意,这不是这些系统的设计目的,除非您打算自己修改 boost 中的代码。但是让我们假设你没有这样做。
这是我们现在的管理方法,在尝试了许多不同的方法之后,这对我们最有效。
对于我们使用的每个版本的 boost,我们将整个树(解压缩)放在文件服务器上,并添加额外的子目录,每个架构/编译器组合都有一个子目录,我们将编译的库放置在其中。我们在每个构建系统上保留这些树的副本,并在全局系统环境中添加变量,例如:
BOOST_1_48=C:\boost\1.48 # Windows environment var
或者
BOOST_1_48=/usr/local/boost/1.48 # Linux environment var, e.g. in /etc/profile.d/boost.sh
此目录包含 boost 树 (boost/*.hpp) 和添加的预编译库 (例如 lib/win/x64/msvc2010/libboost_system*.lib, ...)
所有构建配置(vs 解决方案,vs 属性文件,gnu makefiles,...)定义一个内部变量,导入环境变量,例如:
BOOSTROOT=$(BOOST_1_48) # e.g. in a Makefile, or an included Makefile
并且进一步的构建规则都使用 BOOSTROOT 设置来定义包含路径和库搜索路径,例如
CXXFLAGS += -I$(BOOSTROOT)
LFLAGS += -L$(BOOSTROOT)/lib/linux/x64/ubuntu/precise
LFLAGS += -lboost_date_time
保留 boost 的本地副本的原因是编译速度。它占用了相当多的磁盘空间,尤其是编译后的库,但是存储很便宜,而且开发人员会浪费大量时间编译代码。另外,这只需要复制一次。
使用全局环境变量的原因是构建配置可以从一个系统转移到另一个系统,因此可以安全地签入您的 SCM 系统。
为了使事情变得更顺畅,我们开发了一个小工具来负责复制和设置全局环境。使用 CLI,这甚至可以包含在构建过程中。
不同的工作环境意味着不同的规则和文化,但相信我,我们已经尝试了很多东西,最后,我们决定定义某种约定。也许我们的可以启发你...