2008-10-16 7 views
36

Tengo una biblioteca compartida que deseo vincular un ejecutable contra el uso de GCC. La biblioteca compartida tiene un nombre no estándar que no tiene el formato libNAME.so, por lo que no puedo usar la opción usual -l. (También pasa a ser una extensión de Python, y no tiene el prefijo 'lib')¿Cómo vincular usando GCC sin -l ni la ruta de hardcoding para una biblioteca que no sigue la convención de nomenclatura de libNAME.so?

Puedo pasar la ruta al archivo de la biblioteca directamente a la línea de comando del enlace, pero esto hace que la ruta de la biblioteca sea codificado en el ejecutable.

Por ejemplo:

g++ -o build/bin/myapp build/bin/_mylib.so 

¿Hay una manera de ligar esta biblioteca sin causar el camino a hardcoded en el ejecutable?

Respuesta

57

No es el ":" prefijo que le permite dar diferentes nombres a sus bibliotecas. Si utiliza

g++ -o build/bin/myapp -l:_mylib.so other_source_files 

debe buscar su camino para el _mylib.so.

+1

Esto, señor, es exactamente lo que estaba buscando. ¡Gracias! – kbluck

+0

me ayudó mucho, gracias. –

+2

Estoy descubriendo que esto da como resultado 'build/bin/_mylib.so' incrustado en la biblioteca que se vinculó usando' -l: '- en lugar de incrustar' _mylib.so' como lo hace normalmente para los sonames estándar. Como resultado, cuando intenta cargar '_mylib.so', estaría buscando esa ruta completa (' ldd' se mostraría) y no encontrará '_mylib.so' por sí mismo. –

2

Si puede copiar la biblioteca compartida en el directorio de trabajo cuando g ++ se invoca entonces esto debería funcionar:

g++ -o build/bin/myapp _mylib.so other_source_files 
1

Si está en Unix o Linux creo que se puede crear un enlace simbólico a la biblioteca el directorio que quieres la biblioteca.

Por ejemplo:
ln -s build/bin/_mylib.so build/bin/lib_mylib.so

A continuación, podría utilizar -l_mylib

http://en.wikipedia.org/wiki/Symbolic_link

Cuestiones relacionadas