2010-12-09 26 views

Respuesta

5

en realidad son muy diferentes, especialmente con enlazadores mayores.

Los archivos .o (o .obj) son archivos objeto, contienen el resultado del código generado por el compilador. Todavía está en un formato intermedio, por ejemplo, la mayoría de las referencias aún no están resueltas. Por lo general, hay una asignación de uno a uno entre el archivo de origen y el archivo de objeto.

Los archivos .a (o .lib) son archivos, también conocidos como biblioteca, y son un conjunto de archivos de objeto.

Todos los sistemas operativos tienen herramientas que le permiten agregar/eliminar/enumerar archivos de objeto a archivos de biblioteca.

Otra diferencia, especialmente con los enlazadores más antiguos es la forma en que se tratan los archivos, al vincularlos. Algunos enlaces colocarán el archivo de objeto completo en el binario final, independientemente de lo que realmente se esté usando, mientras que solo extraerán la información útil de los archivos de la biblioteca.

Hoy en día, la mayoría de los enlazadores son lo suficientemente inteligentes como para eliminar todo lo que no se está utilizando.

+1

La última oración es en gran parte falsa. –

+0

Los dos últimos párrafos son falsos. A menos que esté hablando de enlazadores desde antes de 1960 antes de que cosas como esta estuvieran estandarizadas. –

9

Conceptualmente, una unidad de compilación (la unidad de código en un archivo de origen/archivo de objeto) está vinculada por completo o no está en absoluto. Aunque algunas implementaciones, con niveles significativos de cooperación entre el compilador y el enlazador, pueden eliminar el código no utilizado de los archivos objeto en tiempo de enlace, no cambia el problema que incluye 2 unidades de compilación con nombres de símbolo conflictivos en un programa un error.

Como ejemplo práctico, supongamos que su biblioteca tiene dos funciones foo y bar y están juntas en un archivo de objeto. Si quiero usar bar, pero mi programa ya tiene un símbolo externo llamado foo, me encuentro con un error. Incluso si o cómo la implementación podría resolver este problema para mí, el código sigue siendo incorrecto.

Por otro lado, si tengo un archivo de biblioteca que contiene dos archivos de objetos separados, uno con foo y el otro con bar, sólo el uno que contiene bar obtendrá tirado en mi programa.

Al escribir bibliotecas, debe evitar incluir varias funciones en el mismo archivo de objeto a menos que sea esencial que se utilicen juntas. Si lo hace, aumentará las aplicaciones que vinculan su biblioteca (estáticamente) y aumenta la probabilidad de conflictos de símbolos. Personalmente prefiero equivocarme en el lado de los archivos separados cuando hay una duda; incluso es útil poner foo_create y foo_free en archivos separados si este último no es trivial, por lo que los programas puntuales que no necesitan llamar al foo_free pueden evitar tirar el código para la liberación profunda (y posiblemente incluso evitar tirar en la implementación de free sí mismo).

Cuestiones relacionadas