从Linux上的源构建Boost

s.k*_*s.k 3 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
Run Code Online (Sandbox Code Playgroud)

2) 我基本上沿袭了说明
运行./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
Run Code Online (Sandbox Code Playgroud)

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

Mik*_*han 6

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

否。sudo apt-get install libboost-all-dev将安装x.y.z您发行版(Debian,Ubuntu ...?)打包的增强库的任何 版本,就像libboost-all-dev您已应用到系统的最新软件包更新中一样。在我的Ubuntu 18.04系统上,现在恰好是1.65.1。当然,构建和安装boost_1_68_0.tar.bz2下载的tarball 会为您提供1.68.0版。

如果您的软件包管理器提供的libboost-all-dev版本为1.68.0(或与源代码下载版本相同),那么从源代码tarball进行构建和安装将通过编译和链接为您的boost客户端项目提供与安装相同的boost资源。libboost-all-dev包。

但是安装该软件包不会产生在你的文件系统的同一目录和文件的编译和安装源码包,除非与./bootstrap.sh配置相同的安装路径(--prefix--includedir--libdir...),因为被使用的apt软件包安装。因此,例如,我的apt安装libboost-all-dev程序将在下安装boost头文件,在下安装/usr/include/boostboost库二进制文件 /usr/lib/x86_64-linux-gnu。但默认情况下,源tarball安装会将标头放置在下/usr/local/include/boost,库二进制文件放置在下/usr/local/lib

对于给定的boost版本,apt install libboost-all-dev使用默认安装前缀(/usr/local)与源构建和安装之间的唯一区别 是,在源构建和安装之后,如果要链接并运行具有boost 共享的程序(不是静态的) )库,则需要运行 $ sudo ldconfig(在任何目录中)以更新OS加载程序的动态链接缓存。 apt install libboost-all-devldconfig自动更新缓存。

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

这是因为您刚刚构建了 Boost,但没有安装它。你跑了

./bootstrap.sh
Run Code Online (Sandbox Code Playgroud)

在中/opt/boost_1_68_0,完成后它告诉您(其他事情)

Bootstrapping is done. To build, run:

    ./b2
Run Code Online (Sandbox Code Playgroud)

因此,正如您所说的,您逃跑了./b2。即构建。构建完成后,您将看到发布的输出。它告诉您,通过指定编译器搜索选项-I/opt/boost_1_68_0 和链接器搜索选项,您现在可以在客户端项目中使用成功的boost构建-L/opt/boost_1_68_0/stage/lib。您可以在构建目录中 使用boost库这样的库/opt/boost_1_68_0而无需安装它们。如果您的系统没有root特权,那么这将是您必须要做的。

但是,如果您再次 查看链接到的说明,则会发现:

5.1易于构建和安装

在外壳程序中发出以下命令(不要键入$;表示外壳程序的提示符):

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

$ ./bootstrap.sh --prefix=path/to/installation/prefix
Run Code Online (Sandbox Code Playgroud)

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

$ ./b2 install
Run Code Online (Sandbox Code Playgroud)

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

$ sudo ./b2 install
Run Code Online (Sandbox Code Playgroud)

之后,您将分别在/usr/local/include/boost 和下看到boost头文件和库/usr/local/lib,并且无需指定任何显式-I-L选项来编译boost头文件或链接boost库,因为这/usr/local/include 是编译器的默认搜索路径,/usr/local/lib也是默认搜索链接器的路径。

  • @sk 对于​​给定的 boost 版本,`apt install libboost-all-dev` 和从源代码安装之间的唯一区别是安装目录可能存在差异,如我的答案的第 3 段所述。 (2认同)
  • @sk 更正。还有一个区别。如果您使用前缀`/usr/local` 从源代码构建和安装,然后希望使用boost *shared*(非静态)库链接和运行您的程序,您将需要运行`$ sudo ldconfig`(在任何目录中) ) 更新操作系统加载程序的动态链接缓存。`apt install libboost-all-dev` 会自动更新 `ldconfig` 缓存。 (2认同)