如何将静态库链接到共享库
How do you link a static library to a shared library
我正在尝试通过类似命令将静态库链接到共享库
g++ -shared obj.o archive.a -o libLib.so
但是在运行时,我不断得到未解析的系统,该系统应该在编译时从 archive.a 链接。 我试过了
g++ -shared obj.o -Wl,-Bstatic archive.a -Wl,-Bdynamic -o libLib.so
和
g++ -shared obj.o -Wl,-whole-archive archive.a -Wl,-no-whole-archive -o libLib.so
没有成功。 我觉得我在这里错过了一些基本的东西......
你实际上不能(即永远不应该)这样做。共享库应该是与位置无关的代码,但静态库不是。
如果要将libaa
链接到libfoo.so
构建或获取共享(PIC)库libaa.so
,而不是静态(非PIC)库libaa.a
因此,进入共享库foo1.cc
的文件libfoo.so
应编译为
g++ -c -fPIC -Wall -O foo1.cc -o foo1.pic.o
并且库将链接为
g++ -shared foo1.pic.o foo2.pic.o -o libfoo.so
您可以将另一个共享库libsmiling.so
链接到libfoo.so
例如,通过将-lsmiling
附加到上述命令中。但是,您不能将库链接到静态库,只能复制其成员。
但是进入静态库libfoo.a
的文件只是编译为
g++ -Wall -O foo1.cc -o foo1.o
因此,当您从libfoo.a
中提取该foo1.o
成员时,它不是PIC(这是非常低效的)
原则上,您可以将非 PIC 目标代码放在共享库中。实际上,您永远不应该这样做,因为重定位量太大,以至于违背了共享库的目的。如果这样做,文本内存将无法共享,动态链接器将有大量重定位工作。
共享对象内部.so
代码应该是 PIC,以允许ld.so
在不同进程的不同地址段mmap
它。
因此,您可以找到一系列命令将静态库链接到共享库,例如ar x
使用libbar.a
的所有成员进行提取,然后将所有这些提取的bar*.o
与foo*.pic.o
链接,但这将是一个错误。不要将静态非 PIC 库或对象文件链接到 PIC 共享库。
有关详细信息(重点是Linux),请阅读 ld.so(8),ld(1),ELF维基页面,Levine的书:链接器和加载器,Drepper的论文:如何编写共享库
附言。一些非常少的静态库包含 PIC 代码,因为它们可用于创建共享库。例如,我的 Debian 提供了libc6-pic
软件包,特别是提供了/usr/lib/x86_64-linux-gnu/libc_pic.a
静态 PIC 库 - 可用于构建libc.so
的某种变体 - 例如,如果我想将自己的malloc
放在libc.so
中!- 无需重新编译每个 glibc 源文件。
- 链接共享库依赖项未在 ldd 中列出
- Gradle cpp 插件不链接共享库
- 从大型 github 项目链接共享库
- 如何在工具ROS中链接共享库
- Linux C++.链接共享对象和主对象
- 共享对象与提升program_options静态链接;应用程序链接共享
- G++ 5.5 不链接共享库
- 根据用户配置在运行时链接共享对象
- 在静态库中链接失败,但链接共享库成功
- G 无法链接共享对象的静态版本
- 仅当标头在 CMake 中更改时,才重新链接共享库
- 动态链接共享库中的全局变量和静态变量会发生什么情况
- CMake:从外部项目链接共享C++对象会生成具有相对路径的二进制文件,而不是绝对路径
- 在VirtualBox的共享文件夹中构建符号链接共享库
- 编译对象后链接共享库时出错
- 如何通过GNU Autotools链接共享库
- 如何以正确的方式编译和链接C/ c++共享对象库
- 无法链接共享对象
- 在 R 包中生成和链接共享库 - 代码编译、链接,但不会加载
- 如何在cmake中链接共享对象