2011-04-09 10 views
17

Al vincular con bibliotecas utilizando la opción -l (digamos -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?haciendo que gcc prefiera libs estáticos a los objetos compartidos cuando se vincula?

El problema que estoy tratando de resolver es el siguiente: Estoy creando un plugin para una aplicación (el llamado simulador de vuelo X-Plane), con las siguientes limitaciones:

  • el plugin está a estar en la forma de un objeto compartido de 32 bits, incluso cuando se ejecuta en un sistema de 64 bits
  • el entorno de ejecución no proporciona una forma conveniente para cargar objetos compartidos que no están en los lugares 'normales', dicen /usr/lib o /usr/lib32:
    • no se puede esperar que el usuario configure LD_PRELOAD o LD_LIBRARY_PATH para encontrar objetos compartidos enviados con mi complemento
    • el entorno de ejecución X-Plane no agregaría mi directorio de 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 requeridos junto a mi plug-in compartida objeto
  • no se puede esperar 64 bits a los usuarios para instalar objetos compartidos de 32 bits que no son triviales (por ejemplo, no están incluidos en el paquete ia32-libs en ubuntu)

a resuelva las restricciones anteriores, una posible solución es vincular el objeto compartido generado ct contra las versiones estáticas de 32 bits de todas las bibliotecas no triviales utilizadas. pero, cuando se instalan dichas bibliotecas, normalmente se instalan versiones estáticas y dinámicas, por lo que gcc siempre se vinculará con el objeto compartido en lugar de con la biblioteca estática.

por supuesto, mover/eliminar/borrar los objetos compartidos en cuestión, y acaba de salir de las bibliotecas estáticas en decir /usr/lib32, es una solución temporal, pero no es una agradable

nota:

  • sí, lo hice leer sobre cómo vincular objetos compartidos & bibliotecas, y no estoy tratando de creatae un 'objeto compartido totalmente enlazado estáticamente'
  • sí, he intentado -Wl,-static -lfoo -Wl,-Bdynamic, pero no los resultados esperados
  • sí, me trataron -l:libfoo.a así, pero esto no trajo los resultados esperados, ya sea

Respuesta

5

Sólo tiene que añadir el archivo .a a la línea de enlace sin -l como si fuera un archivo .o.

7

Puede especificar la ruta completa de las bibliotecas estáticas sin el indicador -l para vincularlas.

gcc ... source.c ... /usr/lib32/libmysuperlib.a ... 
2

Está fechado, pero puede trabajar: http://www.network-theory.co.uk/docs/gccintro/gccintro_25.html

(casi final de la página)

"Como se señaló anteriormente, también es posible vincular directamente con los archivos de la biblioteca individuales especificando el ruta completa a la biblioteca en la línea de comandos. "

Cuestiones relacionadas