gcc链接针对符号链接共享库



我有两个库,例如两个烤面包机库libtoother_a.soLibtoother_b.soibrtoother_a.so.0.0等。这两个库实现相同的烤面包机接口,但处理方式不同。因此,当我构建一个使用库的应用程序时,使用哪个并不重要(从应用程序的角度来看,它们是相同的)。

因为我想在编译和分发应用程序后决定使用哪个库,所以我创建了一个符号链接libtoother.so,指向librtoother.so.1然后可以指向libtoother_a.so.1和librtoother_b.so.1。因此,用户/安装程序可以简单地更改libtoother.so.1链接以选择要使用的实现。

对于构建,假设默认情况下我有链接到libtoother_a.so.1libtoother.so.1y_app)时,它会正确地编译甚至运行libtover_a.so.1。但是,如果我在my_app上运行ldd,我会看到它被链接到libtoother_a.so.1,而不是根据需要链接到
libtowther.so.1。因此,更改
libtowther.so.1链接没有任何效果。

有没有比制作libtoother_a.so.1,将其重命名为libtoother.so.1针对该库制作my_app,然后删除Libtoother.so.1

当您构建共享库时,将"-Wl,-soname=libtoother.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$

最新更新