c++ - 将 boost 打包到共享库中

标签 c++ boost linker dependencies

我正在尝试编译一些具有 boost 依赖项的代码,我想将其用作动态共享库,但没有任何 boost 依赖项(不需要安装 boost)。我到底该怎么做?

我正在编译我的代码:

g++ -Wall -fPIC -o myclass.o -c myclass.cpp 
g++ -shared -Wl,-soname,myclass.so.1 -o lib/myclass.so.1 myclass.o -lc

但是,构建的库显示了一些 boost 依赖性,如

ldd lib/myclass.so.1

产生输出:

linux-vdso.so.1 (0x00007fffda9df000)
libboost_system.so.1.60.0 => /usr/lib/libboost_system.so.1.60.0 (0x00007f934e776000)
libboost_serialization.so.1.60.0 => /usr/lib/libboost_serialization.so.1.60.0 (0x00007f934e538000)
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00007f934e1b6000)
libm.so.6 => /usr/lib/libm.so.6 (0x00007f934deb0000)
libc.so.6 => /usr/lib/libc.so.6 (0x00007f934db0f000)
/usr/lib64/ld-linux-x86-64.so.2 (0x000055802a452000)
libgcc_s.so.1 => /usr/lib/libgcc_s.so.1 (0x00007f934d8f9000)
librt.so.1 => /usr/lib/librt.so.1 (0x00007f934d6f0000)
libpthread.so.0 => /usr/lib/libpthread.so.0 (0x00007f934d4d3000)

我必须对 g++ 调用进行哪些​​更改才能将所有 boost 依赖项打包到 .so 文件中?

最佳答案

您不能只是将一个 .so “塞入”另一个 .so 中。您需要链接静态库,而不是共享库。

大多数 Linux 发行版都包含一个可选的“开发”子包,其中包含共享库的静态链接版本。

你必须安装那个包,然后完全改变你链接你自己的库的方式。而不是,例如,链接

-lboost_system

您必须将其替换为针对“/usr/lib64/libboost_system.a”或任何安装了 libboost_system.a 的显式链接。起泡、漂洗、重复,不仅针对您直接链接的 boost 库,还针对这些库本身链接的所有其他 boost 库,等等...

有关静态链接版本的共享库的打包位置和方式的信息,请参阅您的 Linux 发行版文档。

关于c++ - 将 boost 打包到共享库中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36345785/

相关文章:

c++ - 编译器可以/是否简化涉及函数的逻辑表达式?

c# - 使用 boost 库在 C++ 中实现多线程的正确方法

c++ - Android 上的简单 boost::spirit 语法 SIGSEGV

c++ - Boost::bind 与对象占位符

c++ - 使用 boost::mutex 作为类的私有(private)成员

c - 最后加载 elf 部分后,闪存中存在其他数据

c++ - 在 Linux 上静态链接库

c++ - 遍历对象列表 C++

c++ - 将字符串中的每个单词输出到一个新行

c++ - 用于在 C++ 中隐藏符号的 LD 脚本