2011-06-14 358 views
7

我有两个库,例如两个烤面包机库libtoaster_a.solibtoaster_b.so和所有相关的主/次/转的符号链接,例如libtoaster_a.so.1.0.0等。这两个库实现相同的烤面包机接口,但只是做不同的处理。因此,当我构建使用该库的应用程序时,无论使用哪个应用程序(从应用程序角度来看它们都是相同的)都无关紧要。gcc的链接共享库

因为我想决定使用哪个库的应用程序已编发后,我做一个符号链接libtoaster.so指向libtoaster.so.1然后可以指向libtoaster_a .so.1libtoaster_b.so.1。因此,用户/安装程序可以简单地更改链接以选择要使用的实现。

对于构建说我有libtoaster.so.1libtoaster_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,创造它更好的方式作为符号链接吗?

回答

5

当您构建共享库时,向gcc标志添加“-Wl,-soname = libtoaster.so.1”(假设您正在使用gcc链接)。这会在库中设置DT_SONAME,并强制任何与该库链接的应用程序都具有从DT_SONAME获取库的名称,而不是从文件的名称。

[[email protected]]~/cprog/toaster1$ gcc -c my_app.c 
[[email protected]]~/cprog/toaster1$ gcc -c toaster.c 
[[email protected]]~/cprog/toaster1$ gcc -o libtoaster_a.so -shared -Wl,-soname=libtoaster.so toaster.o 
[[email protected]]~/cprog/toaster1$ gcc -R$(pwd) -L. -ltoaster_a -o my_app my_app.o 
[[email protected]]~/cprog/toaster1$ ldd my_app 
my_app: 
my_app: can't load library 'libtoaster.so' 
my_app: exit status 4 
[[email protected]]~/cprog/toaster1$ ln -s libtoaster_a.so libtoaster.so 
[[email protected]]~/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 
[[email protected]]~/cprog/toaster1$