我有两个库,例如两个烤面包机库libtoaster_a.so and libtoaster_b.so以及所有相关的主要/次要/修订符号链接,例如libtoaster_a.so.1.0.0等等。这两个库都实现了相同的烤面包机接口,但只是进行了不同的处理。因此,当我构建一个使用该库的应用程序时,使用哪个库并不重要(从应用程序的角度来看,它们是相同的)。
因为我想在应用程序编译和分发后决定使用哪个库,所以我创建了一个符号链接libtoaster.so这指向libtoaster.so.1然后可以指向libtoaster_a.so.1 and libtoaster_b.so.1。因此,用户/安装人员可以简单地更改libtoaster.so.1用于选择要使用的实现的链接。
对于构建说我有libtoaster.so.1链接到libtoaster_a.so.1默认情况下。当我编译我的应用程序时,例如:my_app通过类似的东西gcc -o my_app -ltoaster...
它编译甚至运行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并再次将其创建为符号链接?
当您构建共享库时,将“-Wl,-soname=libtoaster.so.1”添加到 gcc 标志中(假设您正在与 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$
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)