2010-10-11 11 views
5

¿Qué es .a archivos en programación C en Linux? ¿Es un archivo de biblioteca?¿Cómo encuentra un compilador de C que -lm apunta al archivo libm.a?

To merge with the math library libm.a you would type 

cc -o program_name prog.c -lm 

when you compile the program. The -lm means: add in libm. If we wanted to add in the socket library libsocket.a to do some network programming as well, we would type 

cc -o program_name prog.c -lm -lsocket 

and so on. 

Aquí cómo compilador encontrar que -lm se apunta a la libm.a archivo y -lsocket como libsocket.a?

Y si agregamos el archivo de encabezado al programa, ¿debemos mencionar la biblioteca durante la compilación?

+0

Genial. Con su pregunta, ya había respondido a mi pregunta: "¿Qué-estoy parado en la línea de comando del compilador de c?" – NilsB

Respuesta

8

Como dice Ignacio, los archivos .a son bibliotecas estáticas. La "a" significa "archivo" y los archivos .a son construidos por un programa llamado "ar".

Cada archivo .a contiene uno o más archivos .o y un índice de nombres. Durante el proceso de enlace, solo los archivos .o que contienen nombres usados ​​se incluyen en el programa final. Esto es para que, en lugar de incluir toda la biblioteca C, solo se copien las funciones utilizadas como "printf".

¿Cómo encuentra el compilador las bibliotecas? Tiene una colección integrada de rutas de biblioteca que se buscan. A modo de ejemplo, GCC le dirá sus rutas de búsqueda si se les pregunta:

# gcc -print-search-dirs 
install: /usr/lib/gcc/i686-redhat-linux/4.4.4/ 
programs: =/usr/libexec/gcc/i686-redhat-linux/4.4.4/:/usr/libexec/gcc/i686-redhat-linux/4.4.4/:/usr/libexec/gcc/i686-redhat-linux/:/usr/lib/gcc/i686-redhat-linux/4.4.4/:/usr/lib/gcc/i686-redhat-linux/:/usr/libexec/gcc/i686-redhat-linux/4.4.4/:/usr/libexec/gcc/i686-redhat-linux/:/usr/lib/gcc/i686-redhat-linux/4.4.4/:/usr/lib/gcc/i686-redhat-linux/:/usr/lib/gcc/i686-redhat-linux/4.4.4/../../../../i686-redhat-linux/bin/i686-redhat-linux/4.4.4/:/usr/lib/gcc/i686-redhat-linux/4.4.4/../../../../i686-redhat-linux/bin/ 
libraries: =/usr/lib/gcc/i686-redhat-linux/4.4.4/:/usr/lib/gcc/i686-redhat-linux/4.4.4/:/usr/lib/gcc/i686-redhat-linux/4.4.4/../../../../i686-redhat-linux/lib/i686-redhat-linux/4.4.4/:/usr/lib/gcc/i686-redhat-linux/4.4.4/../../../../i686-redhat-linux/lib/:/usr/lib/gcc/i686-redhat-linux/4.4.4/../../../i686-redhat-linux/4.4.4/:/usr/lib/gcc/i686-redhat-linux/4.4.4/../../../:/lib/i686-redhat-linux/4.4.4/:/lib/:/usr/lib/i686-redhat-linux/4.4.4/:/usr/lib/ 

puede agregar más rutas de búsqueda de la biblioteca mediante la opción "-L/ruta".

En esas rutas, primero busca "bibliotecas dinámicas" que se nombran con una extensión ".so". Luego busca bibliotecas estáticas con una extensión ".a". Siempre agrega "lib" al frente del nombre.

2

.a archivos son bibliotecas estáticas, a diferencia de .so archivos que son bibliotecas dinámicas. Normalmente, gcc busca bibliotecas dinámicas, si están disponibles, a menos que haya pasado -static.

El encabezado contiene definiciones que el compilador necesita para compilar el código fuente en un archivo objeto, pero las bibliotecas contienen las rutinas reales que el enlazador necesita para convertir el archivo objeto en un ejecutable.

1

El compilador "sabe" que buscar libm.a (o libm.so) cuando se le pasa la opción -lm, porque así es como la opción -l está documentado e implementado: Tome las siguientes caracteres -l (aquí sólo m) , prefijo lib y sufijo .a para obtener libm.a

Cada biblioteca puede tener su propia relación entre el encabezado y los archivos de biblioteca utilizados. No es común que un archivo de encabezado no requiera ninguna biblioteca, pero es más común que una biblioteca tenga múltiples archivos de encabezado.

Cuestiones relacionadas