从静态库构建共享库
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上,有弱符号和强符号的概念。我在这个答案中写了一个解释。- 我认为将静态库链接到共享库?与您的问题非常相似。
(另请注意,混合动态库和共享库可能不是一个好主意。您最终可能会遇到综合缺点,这与简化的想法背道而驰。但是,我不知道全貌。只是一个意见。
相关文章:
- 为什么构建目录中新构建的共享库与安装目录中的副本具有不同的依赖项集?
- 在OSX上使用CMake将Adobe的XMP工具包构建为共享库的最简单方法是什么?
- 用于构建 cuda .so 文件(共享库)的生成文件
- 为 Python 构建共享库C++时出现分段错误
- 如何使用 CMake 在 android 构建上编译和共享两个 c++ 库
- 如何在 Linux 中构建共享库时使未定义引用的链接器失败
- 如何使用 cmake 在代码中包含、构建和调试共享库 (.so)?
- 如何防止 CMake 在构建时(而不是在安装时)为共享库创建符号链接?
- 从单个.cpp构建共享对象
- 使用 pybind11 构建库,链接其他共享库
- 从静态库构建共享库
- 使用 Makefile 构建共享库
- 我可以在Embarcadero C 建造者中为Android(*.so)构建共享库
- 构建本身是共享_ptr类型的模板容器
- 尝试与从 CUDA 对象构建的共享库链接时未定义的符号
- setuptools:从C++代码构建共享库,然后构建链接到共享库的 Cython 包装器
- 构建共享对象 - 使用 Ninja 编译适用于 OSX 和 Windows 上的 Ubuntu Crush
- 使用boost :: python手动构建共享对象
- 在我的CMake项目中使用静态构建而不是OpenCV的共享构建
- Qt保持构建共享构建无论我选择什么选项