问题描述
|
我有两个库,例如,两个烤面包机库libtoaster_a.so和libtoaster_b.so以及所有相关的主/次要/ rev符号链接,例如libtoaster_a.so.1.0.0等。这两个库都实现了相同的烤面包机接口,但仅进行处理不一样因此,当我构建使用该库的应用程序时,使用哪个库都没有关系(从应用程序的角度来看,它们是相同的)。
因为我想在编译和分发应用程序之后决定使用哪个库,所以我建立了一个符号链接libtoaster.so,它指向libtoaster.so.1,然后可以指向libtoaster_a.so.1和libtoaster_b.so。 1。因此,用户/安装者只需更改libtoaster.so.1链接即可选择要使用的实现。
对于构建,我默认将libtoaster.so.1链接到libtoaster_a.so.1。当我编译应用程序(例如:my_app)时,如ѭ0所示,它甚至可以正确编译并与libtoaster_a.so.1一起运行。但是,如果我在my_app上运行ldd,我会看到它链接到libtoaster_a.so.1而不是所需的libtoaster.so.1,因此更改libtoaster.so.1链接无效。
有没有比将libtoaster_a.so.1重命名为libtoaster.so.1,针对该库进行my_app然后删除libtoaster.so.1并将其再次创建为符号链接更好的方法了?
解决方法
在构建共享库时,请在gcc标志中添加\“-Wl,-soname = libtoaster.so.1 \”(假设您正在与gcc链接)。这将在库中设置DT_SONAME,并将强制链接到该库的任何应用程序都具有从DT_SONAME而非文件名获取的库名。
[vps@manticore]~/cprog/toaster1$ gcc -c my_app.c
[vps@manticore]~/cprog/toaster1$ gcc -c toaster.c
[vps@manticore]~/cprog/toaster1$ gcc -o libtoaster_a.so -shared -Wl,-soname=libtoaster.so toaster.o
[vps@manticore]~/cprog/toaster1$ gcc -R$(pwd) -L. -ltoaster_a -o my_app my_app.o
[vps@manticore]~/cprog/toaster1$ ldd my_app
my_app:
my_app: can\'t load library \'libtoaster.so\'
my_app: exit status 4
[vps@manticore]~/cprog/toaster1$ ln -s libtoaster_a.so libtoaster.so
[vps@manticore]~/cprog/toaster1$ ldd my_app
my_app:
Start End Type Open Ref GrpRef Name
1c000000 3c004000 exe 1 0 0 my_app
05b1f000 25b23000 rlib 0 1 0 /home/vps/cprog/toaster1/libtoaster.so
084f9000 28532000 rlib 0 1 0 /usr/lib/libc.so.51.0
09e80000 09e80000 rtld 0 1 0 /usr/libexec/ld.so
[vps@manticore]~/cprog/toaster1$