g++ 提升 iostreams zlib 链接

g++ boost iostreams zlib linking

我根据本教程使用 zlibbzip2 支持编译 boost iostreams https://www.boost.org/doc/libs/1_49_0/libs/iostreams/doc/installation.html :

我将工作目录更改为 ~/cpp_libs/boost_code/boost_1_55_0/libs/iostreams/build/ 并键入:

bjam -s ZLIB_SOURCE=~/cpp_libs/zlib_code/zlib-1.2.11 -s BZIP2_Source=~/cpp_libs/bzip2_code/bzip2

已生成库:

~/cpp_libs/boost_code/boost_1_55_0/bin.v2/standalone/zlib/gcc-9/debug/libboost_zlib.so.1.55.0 ~/cpp_libs/boost_code/boost_1_55_0/bin.v2/libs/iostreams/build/bzip2/gcc-9/debug/libboost_bzip2.so.1.55.0 ~/cpp_libs/boost_code/boost_1_55_0/bin.v2/libs/iostreams/build/gcc-9/debug/libboost_iostreams.so.1.55.0

但是现在我不知道如何 link 这个库,因为它的名称中有版本扩展。

如果我重命名库:

libboost_zlib.so.1.55.0 至 libboost_zlib.so

libboost_bzip2.so.1.55.0 至 libboost_bzip2.so

libboost_iostreams.so.1.55.0 至 libboost_iostreams.so

我可以 link 使用命令“-lboost_zlib -lboost_iostreams -lboost_bzip2”,但是当我 运行 它打印的编译程序:

./main:加载共享库时出错:libboost_iostreams.so.1.55.0:无法打开共享对象文件:没有这样的文件或目录。

那么如何在不重命名的情况下link到这个库?

我正在使用 g++ (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0

这是用于在 Linux 上构建和安装共享库的常用工作流程。不同库和所有包之间的确切细节差异很大,但它们都遵循相同的通用框架:

  1. 软件包构建安装镜像,将库放在<libdir>/<name>.<version>,其中<libdir>为系统库安装目录,如/usr/lib/usr/lib64,或者可能是 /lib/lib64,或者可能有多种变体。

  2. <name> 是共享库的基本名称,例如您的 libboost_zlib.so ,并且是共享库的 epoch/version/release ,或者 1.55.0.

  3. 作为构建共享库的一部分,库的nameepochversion记录在共享库本身中,在这种情况下它会是 libboost_zlib.so.1.55.

  4. 此时,不同 Linux 分布之间的实际细节开始出现差异。在某些情况下,此步骤作为创建安装包的一部分发生。在其他 Linux 发行版中,当软件包实际安装时会发生这种情况,但在某些时候会执行 ldconfig 工具。

  5. ldconfig 遍历并为标准系统共享库目录中的所有共享库创建所有需要的符号 link。在这种情况下,它将创建以下符号 links:

libboost_zlib.so => libboost_zlib.so.1.55
libboost_zlib.so.1.55 => libboost_zlib.so.55.0

这是已安装共享库的最终状态。当您使用共享库构建软件时,linker 的 -lboost_zlib 标志会导致 linker 尝试 link 带有 libboost_zlib.so 的可执行文件。这会读取实际共享库中编码的 libboost_zlib.so.1.55(参见上面的步骤 3),并且 linked 可执行文件被标记为需要 libboost_zlib.so.1.55 在执行时加载。

当执行 linked 可执行文件时,会尝试打开 libboost_zlib.so.1.55,它使用符号 link 来查找实际的共享库。

I changed working directory to ~/cpp_libs/boost_code/boost_1_55_0/libs/iostreams/build/ and typed:

bjam -s ZLIB_SOURCE=~/cpp_libs/zlib_code/zlib-1.2.11 ...

您使用了非标准过程来编译和构建这些共享库。现在由您来填补缺失的步骤,完成所有繁重的工作,并创建缺失的符号 links。请注意,您可以征用 ldconfig 执行您的命令,方法是将其指向您的安装目录,请参阅其手册页以获取更多信息。

您还需要处理这样一个事实,即共享库最终安装在非标准目录中,运行时加载程序将 而不是 默认搜索。当 link 使用该目录中的共享库编写代码时,您将需要使用其他编译选项(即 -rpath),但这将是一个单独的问题。