c++ - 从静态库构建共享库

标签 c++ boost linker shared-libraries static-libraries

我已经编写了一些代码作为 boost::asio 的包装器,我正在寻找一种方法将其打包为共享对象 (.so),以供某些人使用我正在处理的应用程序,但是我想从 boost 库中删除所有依赖项(主要是因为它们是自定义编译的,并且可能会与默认的预构建 boost 库发生冲突)。我正在将我的代码链接到这些特殊 boost 库的静态版本,但是,链接器提供以下错误:

g++ -D_GLIBCXX_USE_CXX11_ABI=0 -I/path_to_boost_headers -Wall -fPIC -o build/obj.o -c include/source.cpp 
g++ -D_GLIBCXX_USE_CXX11_ABI=0 -shared -Wl,-soname,libobj.so.1 -o lib/libobj.so.1 build/obj.o -lc /project_path/lib/libboost_serialization.a /project_path/lib/libboost_wserialization.a /project_path/lib/libboost_system.a
/usr/bin/ld: /home/joao/Work/ASBG/code/cpp/extra/socket/lib/libboost_system.a(error_code.o): relocation R_X86_64_PC32 against symbol `_ZN5boost6system16generic_categoryEv' can not be used when making a shared object; recompile with -fPIC
/usr/bin/ld: final link failed: Bad value
collect2: error: ld returned 1 exit status

如果我没记错的话,默认情况下,boost 库是使用 -fPIC 编译的。即便如此,我在编译 boost 时添加了标志并替换了库:相同的输出。

最佳答案

尝试将 -Wl,--whole-archive-Wl,--no-whole-archive 放在静态库周围。

未经测试,但像这样的东西可以工作:

g++ -D_GLIBCXX_USE_CXX11_ABI=0 -shared -Wl,-soname,libobj.so.1 \
  -o lib/libobj.so.1 build/obj.o -lc \
  -Wl,--whole-archive \
  /project_path/lib/libboost_serialization.a \
  /project_path/lib/libboost_wserialization.a \
  /project_path/lib/libboost_system.a \
  -Wl,--no-whole-archive

注意事项:

  • --whole-archive 选项强制链接器查看所有符号,而不仅仅是未解析的符号。在 Linux 上,有弱符号和强符号的概念。我在this answer里面写了解释.
  • 我想Link a static lib into a shared lib?与您的问题非常相似。

(另请注意,混合使用动态库和共享库可能不是一个好主意。您最终可能会遇到不利因素,这与您的简化想法背道而驰。但是,我不知道全貌。只是一个意见.)

关于c++ - 从静态库构建共享库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45240888/

相关文章:

c++ - boost::interprocess : managed shared memory errors

c++ - 我可以通过链接此 dl 从动态库加载函数,但如果不链接此 dl,我无法在代码中使用 'dlsym' 加载它

c++ - 卡牌数量多、 Action 复杂的卡牌游戏

c++ - 用自己的类序列化 QHash?

c++ - 在 boost::signals2 中混合 boost 智能指针和 C++11 智能指针

c++ - Matlab - 累积分布函数(CDF)

linker - Xamarin.iOS 链接器为临时删除 i386

gcc - "/usr/bin/ld: cannot find library"

C++ 字符串大小错误

c++ - 为什么在乘法之前转置矩阵会导致很大的加速