Pregunta

Un poco de contexto. Digamos que tengo archivos de origen, que deben terminar en una biblioteca estática. Digamos que hay dos archivos CPP a.cpp y a.cpp ubicado en dos subdirectorios diferentes. Algo como esto:

foo/a.h
foo/a.cpp
bar/a.h
bar/a.cpp

Su contenido no se enfrenta y es completamente diferente. Los nombres de archivo son los mismos.

Ahora, al compilar termino con dos a.o archivos, por supuesto.

gcc -c foo/a.cpp -o foo/a.o
gcc -c bar/a.cpp -o bar/a.o

Si creo una lib está estática ahora con

ar rcs libfoobar.a foo/a.o bar/a.o

Puedo ver ambos archivos dentro de la biblioteca estática en ejecución nm libfoobar.a. Se ve bien.

Problema

El problema que puedo ver es si ejecuto el ar comandar individualmente para foo/a.o y bar/a.o Poniéndolos en la misma biblioteca estática. Ahora el último archivo de objeto sobrescribirá el primero, por lo que cuando se ejecuta nm libfoobar.a Solo veo el último objeto en la biblioteca. Supongo que este es el caso debido al mismo nombre del archivo de objeto.

Al crear una biblioteca estática con ar, si siempre combino todos los objetos de una vez o también está bien correr ar ¿Varias veces la recolección de una parte de los objetos a la vez, todos terminan en la misma biblioteca estática? Para este ejemplo, puedo ver los trabajos anteriores, pero no los últimos.

¿Cómo funcionarán las cosas cuando uno a.cpp cambios y la biblioteca estática debe cambiar? Voluntad ar Encuentra el derecho a.cpp ¿Cambiar en la biblioteca?

Este es solo un pequeño ejemplo, pero considere un proyecto grande con muchos archivos y algunos tienen el mismo nombre. Si ahora desea crear una sola biblioteca, también podría terminar con esta situación.

En general, ¿es solo esta organización pobre de cómo se componen las bibliotecas, cómo se nombran los archivos o hay algo más en esto para que las cosas funcionen?

¿Fue útil?

Solución

Debes pensar en ar como archivador de archivos muy antiguo. Incluso no sabe nada sobre el archivo de un directorio. (Los archivos AR son planos)

(hombre ar): ar - create, modify, and extract from archives

hombre ar, opción r:

r Inserte el miembro de los archivos ... en el archivo (con reemplazo). Esta operación difiere de Q en el que se eliminan los miembros anteriormente existentes si sus nombres coinciden con los que se están agregando.

Intenta ejecutar un ar t libfoobar.a y solo verás a.o archivos porque ar No almacené el nombre del directorio en el archivo.

Por lo tanto, debe nombrar todos los archivos de objetos realizados en Archive AR de manera diferente (UPD) Si desea hacer una actualización de algunos archivos de objetos en la biblioteca con AR

los ar rcs lib.a foo/a.o bar/a.o ¿Un reemplazo de AO encontrado en Lib.A, pero no verifica los archivos agregados para la colisión de nombres?

Otro caso: ar rcs lib.a foo/a.o y ar rcs lib.a bar/a.o almacenará un primer AO en Archivo, luego segundo ar Encontrará a los mayores a.o en Archive y Reemplaza el archivo anterior.

Otros consejos

Una biblioteca es solo una colección de funciones y/o datos que estaban agrupados por archivos de objetos dentro de la biblioteca y esos archivos de objetos tienen un nombre. Esos nombres no juegan ningún papel más que para actualizar /extraer /eliminarlo.

Por lo tanto, es perfectamente legal tener dos nombres idénticos para dos o más archivos de objetos. Al actualizar la biblioteca, el bibliotecario reemplaza el primer objeto con ese nombre que está reemplazando y no se ve más.

Sin embargo, no es algo inteligente.

Solo puedo abordar una parte de su pregunta. Desde la sintaxis MakeFile, vemos que solía ser una forma normal: actualizar solo un objeto. Pero, por ejemplo, el enfoque de Automake es reconstruir la biblioteca desde cero incluso si se cambia un archivo. No plantea un gran problema ahora ...

Lo siento, no tengas a la mano en este momento, así que aún esperaremos a que un experto responda :)

Desde mi propia experiencia, no recomendaría tener dos archivos con el mismo nombre en una biblioteca estática.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top