2012-03-21 22 views
296

Actualmente estoy intentando portar una aplicación C al AIX y estoy confundido. ¿Qué son los archivos .a y .so y cómo se usan al compilar/ejecutar una aplicación?¿Qué son los archivos .a y .so?

+80

uno es library 'a'rchive y otro es 's'hared' o'bject –

+0

Posible duplicado de * [¿Cuál es la diferencia entre .so, .la y .a archivos de biblioteca?] (Https: // stackoverflow. com/questions/12237282/whats-the-difference-between-so-la-and-a-library-files) *. –

Respuesta

324

Las bibliotecas de archivos (.a) están vinculadas estáticamente, es decir, cuando compila su programa con la opción -c en gcc. Entonces, si hay algún cambio en la biblioteca, necesita compilar y construir su código nuevamente.

La ventaja de .so (objeto compartido) sobre una biblioteca es que están vinculados durante el tiempo de ejecución, es decir, después de la creación de su archivo .o -o opción en gcc. Por lo tanto, si hay algún cambio en el archivo .so, no necesita volver a compilar su programa principal. Pero asegúrese de que su programa principal esté vinculado al nuevo archivo .so con comando ln.

Esto lo ayudará a compilar los archivos .so. http://www.yolinux.com/TUTORIALS/LibraryArchives-StaticAndDynamic.html

Espero que esto ayude.

+25

+1 para recursos que el OP claramente necesita – swasheck

+0

En este momento (ver fecha de comentario) el enlace parece estar roto. – ben

+0

@ben lol, acaba de llegar a esta pregunta también, y ahora parece funcionar:> –

129

.a son bibliotecas estáticas. Si usa el código almacenado dentro de ellos, se los quita e incrusta en su propio binario. En Visual Studio, estos serían archivos .lib.

.so son bibliotecas dinámicas. Si usa el código almacenado dentro de ellos, no se toma ni se incrusta en su propio binario. En cambio, solo se hace referencia a él, por lo que el binario dependerá de ellos y el código del archivo so se agregará/cargará en tiempo de ejecución. En Visual Studio/Windows, estos serían archivos .dll (con pequeños archivos .lib que contienen información de enlace).

+11

En mi opinión, esto lo explica incluso mejor que la respuesta aceptada. ¡Gracias! – Petzku

+0

¿hay alguna opción para descompilar el archivo .so en código c/C++? – Ancee

10

.a Los archivos son generalmente bibliotecas que se vinculan estáticamente (o archivos más precisos), y
.so son bibliotecas vinculadas dinámicamente.

Para hacer un puerto necesitará el código fuente que se compiló para hacerlos, o archivos equivalentes en su máquina AIX.

+0

¿Cómo construyo mi aplicación para usar archivos .so? – Dunc

+0

Existen muchas referencias excelentes para construir ambos tipos de bibliotecas y vincularlas en la web. Google es tu amigo. –

+0

@Dunc - Hay un par de maneras.¿Tienes un archivo MAKE? Por lo general, el comando que ensambla todo el programa (y por lo tanto llama al enlazador) especificará los lugares para buscar los archivos de la biblioteca con -L/dir/dir1 /.../ y también puede nombrar bibliotecas explícitamente con -lname. Descubrirá que el nombre real es libname.a o libname.so. El vinculador puede entonces decidir qué hacer si este es un programa razonablemente normal. Pero todavía tiene el problema de crear o encontrar el archivo .so. ¿Tiene el código fuente para construirlo, o una biblioteca de AIX? – gbulmer

7

Se utilizan en la etapa de enlace. Los archivos .a están vinculados estáticamente y los archivos .so están vinculados por tipo, de modo que la biblioteca es necesaria siempre que ejecuta el archivo ejecutable.

Puede encontrar dónde están almacenados mirando cualquiera de los directorios lib ... /usr/lib y /lib tienen la mayoría de ellos, y también está la variable de entorno LIBRARY_PATH.

1

Wikipedia es una fuente decente para esta información.

para aprender acerca de los archivos de biblioteca estática como .a leer Static libarary

Para obtener información sobre los archivos de bibliotecas compartidas gusta leer .so Library_(computing)#Shared_libraries En esta página, también hay información útil en el Nombre de archivo sección.

Cuestiones relacionadas