Pregunta

Supongamos que tengo tres C bibliotecas estáticas dicen libColor.a , que depende de libRGB *. * A que a su vez depende de libPixel.a . La biblioteca libColor.a se dice que dependen de la biblioteca libRGB.a ya que hay algunas referencias en libColor.a a algunas de símbolos definidos en libRGB.a . ¿Cómo combino todas las bibliotecas anteriores a una nueva libNewColor.a , que es independiente?

Independiente significa la nueva biblioteca debe tener todos los símbolos definidos. Así, mientras que la vinculación sólo hay que dar -lNewColor . El tamaño de la nueva biblioteca debe ser mínima es decir que no debe contener ningún símbolos en libRGB.a que no es utilizada por libColor.a etc. Yo probé suerte con varias opciones en ar de comandos (utilizado para crear y actualizar las bibliotecas / archivos estáticos).

¿Fue útil?

Solución

1 / extraer todos los archivos de objetos de cada biblioteca (usando ar) y tratar de compilar el código sin las bibliotecas o cualquiera de los ficheros objeto. Probablemente obtendrá un cubo de carga absoluta de símbolos no definidos. Si no se obtienen símbolos no definidos, vaya al paso 5.

2 / Grab el primero y averiguar cuál es el objeto de archivo que satisface símbolo (usando nm).

3 / anotar que a continuación fichero objeto compilar el código, incluyendo el nuevo archivo de objeto. Usted obtendrá una nueva lista de símbolos no definidos o, si no hay ninguno, vaya al paso 5.

4 / Ir al paso 2.

5 / Combinar todos los ficheros objeto en su lista (si lo hay) en una sola biblioteca (de nuevo con <=>).

Bang! Ahí tienes. Tratar de vincular su código sin que ninguno de los objetos, sino que por la nueva biblioteca.

Todo esto podría ser relativamente fácil de automatizar con una secuencia de comandos shell.

Otros consejos

Una característica poco usada del archivador de GNU es la secuencia de comandos de archivo, que es una interfaz sencilla pero potente, y puede hacer exactamente lo que quiere, por ejemplo, si el siguiente script se llama script.ar:

CREATE libNewColor.a
ADDLIB libColor.a
ADDLIB libRGB.a
ADDLIB libPixel.a
SAVE
END

A continuación, puede invocar ar de la siguiente manera:

ar -M < script.ar

y que se obtendría libNewColor.a que contiene todos los archivos .o de libColor.a libRGB.a y libPixel.a.

Además también se puede añadir archivos .o regulares, así como con el comando ADDMOD:

CREATE libNewColor.a
ADDLIB libColor.a
ADDLIB libRGB.a
ADDLIB libPixel.a
ADDMOD someRandomCompiledFile.o
SAVE
END

Además, es muy fácil de generar estos scripts en Makefile, por lo que normalmente crea una regla makefile bien genérica para la creación de archivos que en realidad genera la secuencia de comandos e invoca ar en el guión. Algo como esto:

$(OUTARC): $(OBJECTS)
    $(SILENT)echo "CREATE $@" > $(ODIR)/$(ARSCRIPT)
    $(SILENT)for a in $(ARCHIVES); do (echo "ADDLIB $$a" >> $(ODIR)/$(ARSCRIPT)); done
    $(SILENT)echo "ADDMOD $(OBJECTS)" >> $(ODIR)/$(ARSCRIPT)
    $(SILENT)echo "SAVE" >> $(ODIR)/$(ARSCRIPT)
    $(SILENT)echo "END" >> $(ODIR)/$(ARSCRIPT)
    $(SILENT)$(AR) -M < $(ODIR)/$(ARSCRIPT)

Aunque ahora que lo miro supongo que no funciona si $ (objetos) está vacío (es decir, si lo que desea es combinar archivos sin añadir archivos de objetos adicionales), pero lo dejaré como ejercicio para el lector para fijar esa cuestión si es necesario ...: D

Estos son los documentos para esta función:

https://sourceware.org/binutils/docs/binutils/ar-scripts .html # ar-scripts

Una biblioteca estática no es mucho más que un archivo de algunos archivos objeto (.o). Lo que puede hacer es extraer todos los objetos en las dos bibliotecas (usando "ar x") y luego usar "ar" para unirlos en una nueva biblioteca.

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