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

时间:2011-06-14 05:19:09

标签: gcc symlink ldd

我有两个库,例如两个烤箱库 libtoaster_a.so libtoaster_b.so 以及所有相关的major / minor / rev符号链接,例如 libtoaster_a。 so.1.0.0 等。两个库都实现相同的烤面包机接口,但只是以不同的方式进行处理。因此,当我构建一个使用库的应用程序时,使用哪个应用程序并不重要(从应用程序的角度来看它们是相同的)。

因为我想在编译和分发应用程序之后决定使用哪个库,我创建了一个符号链接 libtoaster.so ,它指向 libtoaster.so.1 然后可以指向 libtoaster_a.so.1 libtoaster_b.so.1 。因此,用户/安装人员只需更改 libtoaster.so.1 链接即可选择要使用的实现。

对于构建,我默认将 libtoaster_a.so.1 链接到 libtoaster_a.so.1 。当我编译我的应用程序时,例如:{strong> 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,然后删除< strong> libtoaster.so.1 并再次将其创建为符号链接?

1 个答案:

答案 0 :(得分:6)

构建共享库时,将“-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$
相关问题