将共享库与 Linux 中的另一个共享库链接
Linking a shared library with another shared lib in linux
我正在尝试构建一个共享库。让我们说libabc.so
.它使用另一个.so
文件,比如lib123.so
(/usr/local/lib
中的库)。现在我正在我的应用程序中使用我的共享库libabc.so
。说my-app
.我想知道如何链接这些二进制文件?我不想直接将my-app
与lib123.so
联系起来。 my-app
应该只与libabc.so
链接。我该怎么做?
提前谢谢。我正在使用g++
编译器。
假设libabc.so
是从与位置无关的目标代码文件中获取的,abc1.pic.o
和abc2.pic.o
;那么你已经构建了它们,
gcc -Wall -fPIC -O -g abc1.c -c -o abc1.pic.o
gcc -Wall -fPIC -O -g abc2.c -c -o abc2.pic.o
你构建libabc.so
gcc -shared abc1.pic.o abc2.pic.o -L/usr/local/lib -l123 -o libabc.so
我在-l123
之前添加了-L/usr/local/lib
,因为我假设您有一个/usr/local/lib/lib123.so
共享库。
另请阅读程序库操作方法。
如您所见,您可以将共享库lib123.so
链接到您自己的共享库libabc.so
然后与ldd libabc.so
核实
您可能希望通过在链接命令中添加-Wl,-rpath
和-Wl,$RPATHDIR
来在libabc.so
中设置一些 rpath。
有关更多详细信息,请阅读 Drepper 的论文如何编写共享库
不要使用静态库进行lib123.a
(它应该是 PIC)。如果将非 PIC 代码链接到共享对象,则会失去共享对象的大部分优点,并且动态链接器 ld.so 必须执行无数次重定位。
当尝试创建我自己的使用 Berkeley DB 的共享库时,我发现我必须将 -ldb 放在 gcc 命令的末尾,否则它会爆炸说找不到符号"db_create"。 这是在西格温的领导下。
具体来说,这奏效了:
gcc -shared -o $b/$libfile nt_*.o -ldb
这不起作用:
gcc -ldb -shared -o $b/$libfile nt_*.o
遵循Basile Starynkevitch指出的相同过程,例如,我有一个依赖于libm.so
的库,因此库对象的编译是:
gcc -fPIC -Wall -g -I include -I src -c src/wavegen.c -o build/arm/wavegen.o
gcc -fPIC -Wall -g -I include -I src -c src/serial.c -o build/arm/serial.o
但是,要编译库,在某些版本的 gcc 中,库引用的放置顺序很重要,所以我建议,为了确保兼容性,将这些引用放在命令的末尾:
gcc -shared -Wl,-soname,libserial.so.1 -o lib/libserial.so.1.0 build/arm/wavegen.o build/arm/serial.o -lm
我已经在PC(gcc v.8.3.0)和ARM(gcc v.4.6.3)中进行了测试。
- 检查 2D 网格的某个元素是否与另一个元素共享对角线、水平线或垂直线
- 如何创建一个共享对象与另一个.所以在Cmake
- 提升线程问题,当一个线程与另一个线程没有相同的副本时如何共享变量?
- 将其转换为共享指针,并将其作为参数传递给另一个C++类
- 我可以有一个与另一个向量共享存储的向量
- 如何通过另一个类将共享指针传递给一个类?
- 如何将所有权从一个共享指针向量转移到另一个向量?
- 呼叫获取后,将共享_ptr分配给另一个
- 构建并使用使用另一个共享库的源文件中的共享库.(Rinside)
- 如何根据目标体系结构将共享库链接到另一个共享库
- 如何读取STD ::队列与另一个线程共享
- 如何知道一个共享库是否取决于另一个共享库
- 如何将共享库嵌入到另一个共享库中
- 共享内存空间可以将数据(非POD)发送到另一个共享内存吗?
- 与另一个类 c++ 共享对象
- 链接到链接到另一个共享库的共享库会在退出时出错
- 将共享库链接到另一个共享库
- 如何在 c++ 中与另一个类共享变量
- 将共享库与 Linux 中的另一个共享库链接
- 使用共享库的后果dlopen另一个具有不同构建类型的共享库