首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >gcc链接与符号链接共享库

问gcc链接与符号链接共享库
EN

Stack Overflow用户
提问于 2011-06-14 05:19:08
回答 1查看 6.7K关注 0票数 11

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

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

对于构建来说,默认情况下,我已经将libtoaster.so.1链接到libtoaster_a.so.1。当我用类似于libtoaster_a.so.1的东西编译我的应用程序(例如:my_app )时,它会正确地编译甚至使用gcc -o my_app -ltoaster...运行。但是,如果我在libtoaster_a.so.1上运行ldd,我将看到它按需要链接到libtoaster.so.1而不是libtoaster.so.1,因此更改libtoaster.so.1链接没有任何效果。

是否有更好的方法来修复这个问题,而不是让libtoaster_a.so.1,将其重命名为libtoaster.so.1,,根据这个库创建my_app,然后删除libtoaster.so.1并再次创建它作为一个符号链接?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-06-14 06:40:45

在构建共享库时,在gcc旗子中添加"-Wl,-soname=libtoaster.so.1“(假设您与gcc链接)。这将在库中设置DT_SONAME,并将强制任何链接到该库的应用程序从DT_SONAME而不是从文件名中获取库的名称。

代码语言:javascript
复制
[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$
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6339399

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档