【发布时间】:2017-12-27 16:42:17
【问题描述】:
我已经编写了一些代码,可以作为 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 时添加了标志并替换了库:相同的输出。
【问题讨论】:
-
Static boost 库默认不使用
-fPIC编译。静态库通常不是。您构建 PIC 对象的非常规静态增强库的尝试显然失败了,但在不知道该尝试的性质的情况下无法说出原因。
标签: c++ boost linker shared-libraries static-libraries