gpt4 book ai didi

gcc 链接共享库反对符号链接(symbolic link)

转载 作者:行者123 更新时间:2023-12-04 07:58:33 25 4
gpt4 key购买 nike

我有两个库,例如两个 toastr 库 libtoaster_a.so libtoaster_b.so 以及所有相关的主要/次要/修订符号链接(symbolic link),例如 libtoaster_a.so.1.0.0 等等。两个库都实现了相同的 toastr 接口(interface),但只是以不同的方式进行处理。因此,当我构建一个使用该库的应用程序时,使用哪个并不重要(从应用程序的角度来看,它们是相同的)。

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

对于构建说我有 libtoaster.so.1 链接到 libtoaster_a.so.1 默认情况下。当我编译我的应用程序时,例如:我的应用程序 通过 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 并再次将其创建为符号链接(symbolic link)?

最佳答案

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

关于gcc 链接共享库反对符号链接(symbolic link),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6339399/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com