2009-05-06 12 views
32

Estoy compilando algún código que usa libcurl en un sistema Debian Linux. Mi máquina dev está ejecutando Debian 5, pero también quiero que el binario se pueda usar en sistemas anteriores de Debian 4.Cómo enlazar a una versión específica de una biblioteca compartida en GCC

Me parece que si puedo especificar -lcurl se unirá a libcurl.so.4 pero Debian 4 sistemas sólo tienen libcurl.so.3

¿Hay alguna manera de que pueda decirle a gcc para enlazar a cualquiera libcurl.so.3 (que existe en Debian 4 y 5) o simplemente libcurl.so, de modo que usará la versión que esté disponible?

+1

En la versión anterior de Debian, ¿no es libcurl.so un enlace simbólico a libcurl.so.3? Quiero decir, parece extraño que -lcurl no haga lo correcto por defecto. –

+0

kastauyra: las versiones no son, o al menos no pueden suponerse, compatibles con binarios. Entonces, cuando lo vincula, registra la versión principal vinculada en el binario: si compila en el sistema más nuevo, requerirá la versión 4 y no funcionará en el sistema anterior. (En realidad, lo que registra es el soname, que es una cadena almacenada en el archivo de la biblioteca que convencionalmente pero no necesariamente es algo "libcurl.so.3") –

Respuesta

22

Puede pasar el archivo .so real en lugar de -l en la línea de comando del enlazador, y debe hacer lo que desee.

+1

Ah, eso casi funciona, excepto que libcurl.so es solo un enlace simbólico a lubcurl.so.4 en Debian y por lo tanto, todavía se vincula a libcurl.so.4. –

+0

Lo marcaré como una respuesta aceptada, aunque no es exactamente correcto para libcurl en Debian 5. Lo que terminé haciendo fue obtener una copia de libcurl.so.3 de un sistema Debian 4 y vincularlo directamente al especificar el. por lo que el nombre del archivo como bdonlan sugirió. –

1

¿Qué le parece crear un enlace simbólico local a su proyecto que enlace a .3, entonces puede usar -L en tiempo de compilación. Sin embargo, no estoy seguro de si te darían un conflicto de nombres, pero siempre podrías llamarlo libcurl-old.so por las dudas.

53

En lugar de utilizar "-lcurl" uso "-l: libcurl.so.3" Y por supuesto también utilizar "-L _installed_path_"

+0

mismo problema cuando se enlace simbólicamente. -l: libX.so enlaces a libX.so.Y en su lugar – Gregory

+1

Esto no funciona para mí, incluso con el rpath. ldd lo muestra enlazando con una cosa. El resultado vinculado muestra el nombre de archivo correcto. Pero strace confirma que está cargando el archivo.2 en lugar del archivo.2.3 y no es un enlace simbólico. – jgmjgm

+0

Estoy tentado de marcar esto como una respuesta. Realmente salvaste mi opinión @ engineer.udays – user5241806

0

Creo que la forma correcta de hacerlo será el uso de la --filter y --auxiliary banderas del enlazador.

No están muy documentadas, pero deberían permitirle cargar símbolos de diferentes versiones de la misma biblioteca de acuerdo con la máquina en la que está instalado.

Cuestiones relacionadas