2010-10-01 21 views
24

Después de la pregunta How do applications resolve to different versions of shared libraries at run time?, me pregunté cómo especificar en el enlace la línea de comando qué versión de la biblioteca usar?¿Cómo especificar la versión de la biblioteca para usar en tiempo de enlace?

Digamos que tengo

libmy.so.1.0 
libmy.so.1 -> libmy.so.1.0 
libmy.so.2.0 
libmy.so.2 -> libmy.so.2.0 
libmy.so  -> libmy.so.2 

La forma habitual para especificar la biblioteca para enlazar con el ejecutable no muestra la versión de usar. Además, es muy probable que uno quiera vincularse con la versión más reciente. Por lo tanto, la línea habitual funciona bien en la mayoría de los casos.

gcc app.o -lmy -o app 

¿Cuál es la línea de comandos para vincular app que debe utilizar la versión 1 de la biblioteca?

Respuesta

31

El enlazador es capaz de aceptar los nombres de archivo también

gcc app.o -l:libmy.so.1 -o app 

De man ld:

namespec -l
--library = namespec
añadir el archivo de almacenamiento o un objeto especificado por namespec a la lista de archivos a vincular. Esta opción se puede usar cualquier cantidad de veces. Si namespec tiene la forma: filename, ld buscará en la ruta de acceso de la biblioteca un archivo llamado filename, de lo contrario buscará en la biblioteca ruta para un archivo llamado libnamespec.a.

me di cuenta que las versiones anteriores no son compatibles con ella, a fin de comprobar man ld-l o --library opción en su sistema.

También puede vincular al archivo de mencionar su nombre completo

gcc app.o /mylibpath/libmy.so.1 -o app 
+10

Tenga cuidado: lo utiliza enlazador, y lo que se resuelve dynamicaly en tiempo de ejecución (lo que 'ldd app' mostrará) podría no ser el mismo . –

Cuestiones relacionadas