2011-06-14 21 views
7

tengo dos bibliotecas, por ejemplo, dos bibliotecas tostadora libtoaster_a.so y libtoaster_b.so y de los principales enlaces simbólicos/menor/rev asociados P. ej libtoaster_a.so.1.0.0 etc. Ambas bibliotecas implementan la misma interfaz tostadora, pero simplemente realizan el procesamiento de manera diferente. Por lo tanto, cuando construyo una aplicación que usa la biblioteca, no importa cuál se use (desde la perspectiva de las aplicaciones son las mismas).enlace gcc contra enlace simbólico

Porque me gustaría decidir qué biblioteca para usar después de la aplicación se ha compilado y distribuido hago un enlace simbólico libtoaster.so que apunta a libtoaster.so.1 que puede apuntar a libtoaster_a .so.1 y libtoaster_b.so.1. Por lo tanto, el usuario/instalador podría simplemente cambiar el enlace libtoaster.so.1 para elegir la implementación que se usará.

Para que la creación decir que tengo libtoaster.so.1 vinculado a libtoaster_a.so.1 por defecto. cuando compilo mi aplicación, por ejemplo: my_app por algo así como gcc -o my_app -ltoaster... compila e incluso se ejecuta con libtoaster_a.so.1 correctamente. Sin embargo, si ejecuto ldd en my_app, veré que está vinculado a libtoaster_a.so.1 en lugar de libtoaster.so.1 según lo desee, por lo tanto, cambiar el libtoaster.so.1 no tiene ningún efecto.

¿Existe una manera más agradable para solucionar este problema de hacer libtoaster_a.so.1, cambiar el nombre a libtoaster.so.1, haciendo my_app contra esta biblioteca a continuación, eliminar libtoaster.so.1 y creándolo como un enlace simbólico de nuevo?

Respuesta

5

Al compilar las bibliotecas compartidas, agregue "-Wl, -soname = libtoaster.so.1" a las banderas gcc (suponiendo que esté enlazando con gcc). Esto establece DT_SONAME en la biblioteca y forzará a cualquier aplicación vinculada con esa biblioteca a tener el nombre de la biblioteca tomado de DT_SONAME, en lugar de hacerlo desde el nombre del archivo.

[[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$ 
Cuestiones relacionadas