在Linux中将一个共享库与另一个共享库链接起来
- 2024-10-18 09:00:00
- admin 原创
- 209
问题描述:
我正在尝试构建一个共享库。假设libabc.so
。它使用另一个.so
文件,例如lib123.so
(中的库/usr/local/lib
)。现在我正在libabc.so
应用程序中使用我的共享库。假设my-app
。我想知道我应该如何链接这些二进制文件?我不想直接链接my-app
到lib123.so
。my-app
应该只链接到libabc.so
。我该怎么做?
提前致谢。我正在使用g++
编译器。
解决方案 1:
假设它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
我-L/usr/local/lib
之前 -l123
添加过,因为我假设你有一个/usr/local/lib/lib123.so
共享库。
另请阅读程序库操作方法。
如你所见,你可以将共享库链接lib123.so
到你自己的共享库中libabc.so
然后检查ldd libabc.so
您可能希望通过在链接命令中添加和来设置一些rpath 。libabc.so
`-Wl,-rpath`-Wl,$RPATHDIR
有关更多详细信息,请阅读 Drepper 的论文《如何编写共享库》
PS. 不要使用静态库lib123.a
(应该是 PIC)。如果将非 PIC 代码链接到共享对象,则会失去共享对象的大多数优势,并且动态链接器ld.so必须进行无数次重定位。
解决方案 2:
当我尝试创建我自己的使用 Berkeley DB 的共享库时,我发现我必须将 -ldb 放在 gcc 命令的末尾,否则它会崩溃,提示未找到符号“db_create”。这是在 Cygwin 下。
具体来说,这是有效的:
gcc-共享-o $b/$libfile nt_*.o-ldb
这不起作用:
gcc -ldb -shared -o $b/$libfile nt_*.o
解决方案 3:
按照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)上进行了测试。
- 2025年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 项目管理必备:盘点2024年13款好用的项目管理软件
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)