linux - libreria - ¿Hacer que gcc prefiera librerías estáticas a objetos compartidos al vincular?
crear libreria dinamica linux (3)
Está fechado, pero puede funcionar: http://www.network-theory.co.uk/docs/gccintro/gccintro_25.html
(casi al final de la página)
" Como se señaló anteriormente, también es posible vincular directamente con archivos de biblioteca individuales especificando la ruta completa a la biblioteca en la línea de comandos " .
Al enlazar con bibliotecas usando la opción -l
(por ejemplo, -lfoo
), gcc preferirá un objeto compartido a una biblioteca estática si se encuentran ambos (preferirá libfoo.so
a libfoo.a
). ¿Hay alguna manera de hacer que gcc prefiera la biblioteca estática, si se encuentran ambas?
El problema que estoy tratando de resolver es el siguiente: Estoy creando un complemento para una aplicación (el simulador de vuelo llamado X-Plane), con las siguientes restricciones:
- el complemento debe tener la forma de un objeto compartido de 32 bits, incluso cuando se ejecuta en un sistema de 64 bits
- el entorno en ejecución no proporciona una forma conveniente de cargar objetos compartidos que no se encuentran en las ubicaciones "normales", por ejemplo
/usr/lib
o/usr/lib32
:- no se puede esperar que el usuario configure
LD_PRELOAD
oLD_LIBRARY_PATH
para encontrar objetos compartidos enviados con mi complemento - el entorno de ejecución de X-Plane no agregaría el directorio de mis complementos a `` LD_LIBRARY_PATH, antes de cargar dinámicamente el objeto compartido de complemento, lo que me permitiría enviar todos mis objetos compartidos necesarios junto con mi objeto compartido de complemento
- no se puede esperar que el usuario configure
- no se puede esperar que los usuarios de 64 bits instalen objetos compartidos de 32 bits que no sean triviales (por ejemplo, no están incluidos en el paquete ia32-libs en ubuntu)
para resolver las restricciones anteriores, una posible solución es vincular el objeto compartido generado con versiones estáticas de 32 bits de todas las bibliotecas no triviales utilizadas. pero, al instalar tales bibliotecas, generalmente se instalan versiones tanto estáticas como dinámicas, y por lo tanto, gcc siempre se vinculará con el objeto compartido en lugar de la biblioteca estática.
por supuesto, mover / eliminar / eliminar los objetos compartidos en cuestión, y simplemente dejar las bibliotecas estáticas en say /usr/lib32
, es una /usr/lib32
, pero no es agradable
Nota:
- sí, he leído cómo vincular objetos y bibliotecas compartidas, y no estoy tratando de crear un ''objeto compartido totalmente vinculado estáticamente''
- sí, probé
-Wl,-static -lfoo -Wl,-Bdynamic,
pero no-Wl,-static -lfoo -Wl,-Bdynamic,
los resultados esperados - sí, también probé
-l:libfoo.a
, pero esto tampoco produjo los resultados esperados
Puede especificar la ruta completa a las bibliotecas estáticas sin el indicador -l
para vincularlas.
gcc ... source.c ... /usr/lib32/libmysuperlib.a ...
Simplemente agregue el archivo .a
a la línea de enlace sin -l
como si fuera un archivo .o
.