gcc - librerias - como crear una libreria en c++
Forma correcta de vincular una biblioteca estática usando GCC (4)
¿Te ha importado indicar a GCC la ruta de tu biblioteca (usando -L)? Al usar -l únicamente, GCC solo podrá vincular bibliotecas disponibles en directorios estándar.
-L[path] -l[lib]
¿Por qué es que algunas bibliotecas estáticas (lib * .a) se pueden vincular de la misma manera que las bibliotecas compartidas (lib * .so) están vinculadas (conmutador ld -l), pero otras no?
Siempre me habían enseñado que todas las bibliotecas, estáticas o no, pueden vincularse con -l ..., sin embargo, me he topado con una biblioteca hasta ahora (GLFW), que no hace más que emitir errores de enlace de "referencia no definida" si yo Intenta enlazarlo de esta manera.
De acuerdo con la respuesta a esta pregunta , la forma "adecuada" de vincular bibliotecas estáticas es incluirlas directamente, junto con mis propios archivos de objetos, en lugar de usar -l. Y, en el caso de la biblioteca GLFW, esto ciertamente resuelve el problema. Pero todas las demás bibliotecas estáticas que estoy usando funcionan bien cuando están enlazadas con -l.
Asi que:
- ¿Qué podría hacer que esta biblioteca no funcione cuando está vinculada en lugar de incluirla directamente? 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 bibliotecas estáticas de la misma manera que vincula bibliotecas compartidas? (¿Y si no, Pórque 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?
Gracias por las respuestas! Resulta que el problema se debió a orden de enlace. Aparentemente, si usa una biblioteca que a su vez tiene otras dependencias de la biblioteca, esas otras dependencias deben aparecer en la lista después de la biblioteca, no antes como lo había estado haciendo. Aprendí algo nuevo!
La forma correcta de vincular una biblioteca estática es usando -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 su nombre, como usted dice.
Lo mismo es cierto para las bibliotecas compartidas, en realidad, aunque es más probable que se encuentren, tal vez.
La razón es histórica. La herramienta "ar" era la herramienta de archivo original en PDP11 unix, aunque luego fue reemplazada completamente por "tar" para ese propósito. Almacena archivos (archivos de objeto, en este caso) en un paquete. Y hay una extensión separada que contiene la tabla de símbolos para que la use el enlazador. Es posible si está administrando manualmente los archivos en el archivo que la tabla de símbolos puede quedar obsoleta.
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, intente averiguar de dónde provienen las bibliotecas corruptas y corríjalo.