从Linux上的源构建Boost

时间:2018-12-06 08:46:48

标签: boost build

说明:

我正在尝试从Ubuntu 18.04上的源代码构建Boost库(1.68)。

https://www.boost.org/doc/libs/1_68_0/more/getting_started/unix-variants.html
https://www.boost.org/users/history/version_1_68_0.html

问题:

1)对于同一版本,它等同于sudo apt-get install libboost-all-dev吗? ...基本上将安装所有这些部门:

The following NEW packages will be installed:    
  libboost-all-dev libboost-atomic-dev libboost-atomic1.65-dev libboost-atomic1.65.1 libboost-chrono-dev libboost-chrono1.65-dev
  libboost-chrono1.65.1 libboost-container-dev libboost-container1.65-dev libboost-container1.65.1 libboost-context-dev
  libboost-context1.65-dev libboost-context1.65.1 libboost-coroutine-dev libboost-coroutine1.65-dev libboost-coroutine1.65.1
  libboost-date-time-dev libboost-date-time1.65-dev libboost-exception-dev libboost-exception1.65-dev libboost-fiber-dev
  libboost-fiber1.65-dev libboost-fiber1.65.1 libboost-filesystem-dev libboost-filesystem1.65-dev libboost-graph-dev
  libboost-graph-parallel-dev libboost-graph-parallel1.65-dev libboost-graph-parallel1.65.1 libboost-graph1.65-dev
  libboost-graph1.65.1 libboost-iostreams-dev libboost-iostreams1.65-dev libboost-locale-dev libboost-locale1.65-dev
  libboost-log-dev libboost-log1.65-dev libboost-log1.65.1 libboost-math-dev libboost-math1.65-dev libboost-math1.65.1
  libboost-mpi-dev libboost-mpi-python-dev libboost-mpi-python1.65-dev libboost-mpi-python1.65.1 libboost-mpi1.65-dev
  libboost-mpi1.65.1 libboost-numpy-dev libboost-numpy1.65-dev libboost-numpy1.65.1 libboost-program-options-dev
  libboost-program-options1.65-dev libboost-program-options1.65.1 libboost-python-dev libboost-python1.65-dev
  libboost-python1.65.1 libboost-random-dev libboost-random1.65-dev libboost-random1.65.1 libboost-regex-dev
  libboost-regex1.65-dev libboost-regex1.65.1 libboost-serialization-dev libboost-serialization1.65-dev
  libboost-serialization1.65.1 libboost-signals-dev libboost-signals1.65-dev libboost-signals1.65.1 libboost-stacktrace-dev
  libboost-stacktrace1.65-dev libboost-stacktrace1.65.1 libboost-system-dev libboost-system1.65-dev libboost-test-dev
  libboost-test1.65-dev libboost-test1.65.1 libboost-thread-dev libboost-thread1.65-dev libboost-timer-dev libboost-timer1.65-dev
  libboost-timer1.65.1 libboost-tools-dev libboost-type-erasure-dev libboost-type-erasure1.65-dev libboost-type-erasure1.65.1
  libboost-wave-dev libboost-wave1.65-dev libboost-wave1.65.1 libboost1.65-tools-dev

2) 我基本上遵循instructions
从我下载的位置(即在./bootstrap.sh中运行/opt/boost_18_0/bootstrap.sh
然后./b2

b2流程结束时,它显示:

(...)
...updated 1275 targets...

The Boost C++ Libraries were successfully built!

The following directory should be added to compiler include paths:
    /opt/boost_1_68_0

The following directory should be added to linker library paths:
    /opt/boost_1_68_0/stage/lib

我想知道为什么根据/usr/local选项的bootstrap.sh默认设置,它为什么不在--prefix中?

1 个答案:

答案 0 :(得分:2)

  

1)它等同于sudo apt-get install libboost-all-dev

不。 sudo apt-get install libboost-all-dev将安装任何内容 您发行版的x.y.z版Boost库(Debian,Ubuntu ...?) 在最新的软件包更新中已打包为libboost-all-dev 您已将其应用于系统。在我的Ubuntu 18.04系统上 现在是1.65.1。构建并安装用于以下目的的tarball boost_1_68_0.tar.bz2: 当然,您下载的版本将为1.68.0。

如果包管理器提供的libboost-all-dev版本为1.68.0 (或与您下载的版本相同的版本),然后构建并 从源代码tarball安装将为您的boost客户项目提供 通过编译和链接与安装完全相同的增强资源 libboost-all-dev包。

但是安装该软件包不会 在文件系统中创建与构建和安装相同的目录和文件 源压缩包,除非使用./bootstrap.sh配置相同的安装路径 --prefix软件包安装所使用的{--includedir--libdirapt ...)。 因此,例如我的apt安装libboost-all-dev安装了增强功能 /usr/include/boost下的标头和下的boost库二进制文件 /usr/lib/x86_64-linux-gnu。但是默认情况下,源tarball安装 将标头放在/usr/local/include/boost和库二进制文件下 在/usr/local/lib下。

对于给定的boost版本, apt install libboost-all-dev和源代码构建并使用默认安装进行安装 前缀(/usr/local)是在源代码构建和安装后,如果您希望链接和 使用boost shared (非静态)库运行程序,则需要运行 $ sudo ldconfig(在任何目录中)以更新OS加载程序的动态链接缓存。 apt install libboost-all-dev将自动更新ldconfig缓存。

  

我想知道为什么根据--prefix选项的bootstrap.sh默认设置,它为什么不在/ usr / local中?

那是因为您刚刚构建了 Boost,但尚未安装。你跑了

./bootstrap.sh

/opt/boost_1_68_0中,当完成时它告诉了你(还有其他事情)

Bootstrapping is done. To build, run:

    ./b2

因此,正如您所说,您运行了./b2。也就是说,要构建。而当建筑 完成后,您看到了已发布的输出。它告诉您成功的提升构建 现在可以通过指定编译器搜索选项-I/opt/boost_1_68_0在客户端项目中使用 以及链接器搜索选项-L/opt/boost_1_68_0/stage/lib。您可以像这样使用boost库, 从构建目录 /opt/boost_1_68_0中,不安装它们。这就是你必须要做的 如果您在系统上没有root特权,该怎么办。

但是,如果您再次查看the instructions 链接到后,您会发现:

  

5.1易于构建和安装

     

在shell中发出以下命令(不要键入$;代表shell的提示符):

     

选择配置选项,然后不带--help选项再次调用./bootstrap.sh。除非您在系统的/ usr / local /目录中具有写权限,否则您可能至少要使用

$ ./bootstrap.sh --prefix=path/to/installation/prefix
  

安装在其他地方。另外,考虑使用--show-libraries和--with-libraries = library-name-list选项来限制构建所有内容时的漫长等待。最后,

$ ./b2 install

您尚未运行./b2 install,并且已指定安装还是默认安装 --prefix需要root权限才能写-默认/usr/local就是这种情况-那么您需要运行

$ sudo ./b2 install

此后,您将在/usr/local/include/boost下看到boost标题和库 和/usr/local/lib,并且您无需指定任何明确的-I-L选项来编译增强标题或链接增强库,因为/usr/local/include 是编译器的默认搜索路径,而/usr/local/lib是该编译器的默认搜索路径。 链接器。