繁体   English   中英

从静态库构建共享库

[英]Building shared library from 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上,有弱符号和强符号的概念。 我已经在这个答案中写了一个解释。
  • 我认为将静态库链接到共享库中? 与您的问题非常相似。

(还请注意,动态混合和共享库可能不是一个好主意。您可能最终会面临综合弊端,这与您的简化想法背道而驰。但是,我不了解整个情况。只是一种意见。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM