我编写了一些代码作为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
如果我没弄错的话,默认情况下会使用-fPIC
编译boost库。即便如此,我在编译boostand时添加了标志,取代了库:相同的输出。
答案 0 :(得分:2)
尝试将-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写了一个解释。(另外请注意,混合动态和共享库可能不是一个好主意。你最终可能会遇到综合的缺点,这与你的简化想法不符。但是,我不知道整个情况。只是一个意见。)