2012-03-31 22 views
21

¿Por qué algunas bibliotecas estáticas (lib * .a) se pueden vincular de la misma manera que las bibliotecas compartidas (lib * .so) están vinculadas (ld -l interruptor), pero algunos no pueden?Forma correcta de vincular una biblioteca estática utilizando GCC

Siempre me han enseñado que todas las bibliotecas, estáticas o no, se pueden vincular con -l ..., sin embargo, he encontrado una biblioteca hasta el momento (GLFW), que no hace más que arrojar "referencia indefinida" errores de enlace si intento vincularlo de esta manera.

Según la respuesta en this question, la forma "correcta" de vincular las bibliotecas estáticas es incluirlas directamente, junto con mis propios archivos de objeto, en lugar de usar -l. Y, en el caso de la biblioteca GLFW, esto definitivamente resuelve el problema. Pero cada otra biblioteca estática que estoy usando funciona bien cuando se vincula con -l.

Así:

  • Lo que podría causar esta una biblioteca a no funcionar cuando se unen en lugar de directamente incluido? Si supiera la causa, tal vez podría editar y volver a compilar la biblioteca para solucionar el problema.
  • ¿Es cierto que se supone que no debe vincular las bibliotecas estáticas de la misma manera que las bibliotecas compartidas? (Y si no, ¿por qué no?)
  • ¿El enlazador aún puede eliminar las funciones de biblioteca no utilizadas del ejecutable de salida cuando la biblioteca se incluye directamente de esta manera?

Respuesta

25

Gracias por las respuestas! Resulta que el problema se debió al orden del enlace. Aparentemente, si usa una biblioteca que a su vez tiene otras dependencias de biblioteca, esas otras dependencias deben aparecer en la lista después de en la biblioteca, no antes como lo había estado haciendo. ¡Aprendí algo nuevo!

5

¿Le ha importado indicar a GCC la ruta de su biblioteca (usando -L)? Al usar -l únicamente, GCC solo podrá vincular bibliotecas disponibles en directorios estándar.

-L[path] -l[lib] 
+0

Sí, las rutas de acceso a cada biblioteca se proporcionan utilizando -L, antes del indicador -l correspondiente. GCC puede encontrar la biblioteca, pero proporciona una gran cantidad de errores de referencia no definidos dentro de la biblioteca. – Nairou

1

La razón es histórica. La herramienta "ar" fue original de la herramienta de archivo de archivos en PDP11 unix, aunque más tarde fue reemplazada por "tar" para ese fin. Almacena archivos (archivos de objetos, en este caso) en un paquete. Y hay una extensión separada que contiene la tabla de símbolos para que el enlazador la use. Es posible si está administrando manualmente archivos en el archivo que la tabla de símbolos puede quedar desactualizada.

La respuesta corta es que puede usar la herramienta "ranlib" en cualquier archivo para recrear la tabla de símbolos. Trata eso. En términos más generales, intenta averiguar de dónde provienen las bibliotecas corruptas y corrige eso.

+2

Creo que OP significa enlace * contra * una biblioteca, no crea una biblioteca. – ams

5

La forma correcta de vincular una biblioteca estática es utilizando -l, pero eso solo funciona si la biblioteca se puede encontrar en la ruta de búsqueda. Si no es así, puede agregar el directorio a la lista usando -L o nombrar el archivo por nombre, como usted dice.

Lo mismo es cierto para las bibliotecas compartidas, en realidad, aunque es más probable que se encuentren, tal vez.

Cuestiones relacionadas