g++ 提升 iostreams zlib 链接
g++ boost iostreams zlib linking
我根据本教程使用 zlib 和 bzip2 支持编译 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 上构建和安装共享库的常用工作流程。不同库和所有包之间的确切细节差异很大,但它们都遵循相同的通用框架:
软件包构建安装镜像,将库放在<libdir>/<name>.<version>
,其中<libdir>
为系统库安装目录,如/usr/lib
或/usr/lib64
,或者可能是 /lib
或 /lib64
,或者可能有多种变体。
<name>
是共享库的基本名称,例如您的 libboost_zlib.so
,并且是共享库的 epoch/version/release ,或者 1.55.0
.
作为构建共享库的一部分,库的name
、epoch
和version
记录在共享库本身中,在这种情况下它会是 libboost_zlib.so.1.55
.
此时,不同 Linux 分布之间的实际细节开始出现差异。在某些情况下,此步骤作为创建安装包的一部分发生。在其他 Linux 发行版中,当软件包实际安装时会发生这种情况,但在某些时候会执行 ldconfig
工具。
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
),但这将是一个单独的问题。
我根据本教程使用 zlib 和 bzip2 支持编译 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 上构建和安装共享库的常用工作流程。不同库和所有包之间的确切细节差异很大,但它们都遵循相同的通用框架:
软件包构建安装镜像,将库放在
<libdir>/<name>.<version>
,其中<libdir>
为系统库安装目录,如/usr/lib
或/usr/lib64
,或者可能是/lib
或/lib64
,或者可能有多种变体。<name>
是共享库的基本名称,例如您的libboost_zlib.so
,并且是共享库的 epoch/version/release ,或者1.55.0
.作为构建共享库的一部分,库的
name
、epoch
和version
记录在共享库本身中,在这种情况下它会是libboost_zlib.so.1.55
.此时,不同 Linux 分布之间的实际细节开始出现差异。在某些情况下,此步骤作为创建安装包的一部分发生。在其他 Linux 发行版中,当软件包实际安装时会发生这种情况,但在某些时候会执行
ldconfig
工具。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
),但这将是一个单独的问题。