Tengo un pequeño fragmento de código que depende de muchas bibliotecas estáticas (a_1-a_n). Me gustaría empaquetar ese código en una biblioteca estática y ponerlo a disposición de otras personas.
Mi biblioteca estática, llamémosla X, se compila bien.
Creé un programa de muestra simple que usa una función de X, pero cuando trato de vincularlo a X, obtengo muchos errores sobre símbolos faltantes de las bibliotecas a_1 - a_n.
¿Hay alguna manera de que pueda crear una nueva biblioteca estática, Y que contenga X y toda la funcionalidad que necesita X (bits seleccionados de a_1 - a_n), para poder distribuir solo Y para que las personas vinculen sus programas?
ACTUALIZAR:
He analizado simplemente deshacer todo con ar y crear una mega lib, sin embargo, eso termina incluyendo muchos símbolos que no son necesarios (todos los archivos .o son de aproximadamente 700 MB, sin embargo, un ejecutable vinculado estáticamente es 7 MEGABYTE). ¿Hay una buena manera de incluir solo lo que realmente se necesita?
Esto se ve muy relacionado con ¿Cómo combinar varias bibliotecas C / C ++ en una? .
-r
con la que la salida se puede utilizar como entrada para ld. Si vincula una vez, debe obtener un reubicable, puede sustituir sus bibliotecas. (lo probé thogh).Si está utilizando Visual Studio, sí, puede hacerlo.
La herramienta de creación de bibliotecas que viene con Visual Studio le permite unir bibliotecas en la línea de comandos. Sin embargo, no conozco ninguna forma de hacer esto en el editor visual.
fuente
En Linux o MingW, con la cadena de herramientas GNU:
Si no elimina
liba.a
ylibb.a
puede hacer un "archivo delgado":En Windows, con la cadena de herramientas MSVC:
fuente
ar crsT
, que hace algo como "simular" en lugar de copiar, entonces solo necesita enviar una copia de los datos.Una biblioteca estática es solo un archivo de archivos de
.o
objetos. Extraerlos conar
(suponiendo Unix) y empacarlos de nuevo en una gran biblioteca.fuente
Como alternativa a las
Link Library Dependencies
propiedades del proyecto, hay otra forma de vincular bibliotecas en Visual Studio.Add Existing Item...
).Item Type
seaLibrary
Esto incluirá las otras bibliotecas en X como si ejecutaras
fuente
Tenga en cuenta antes de leer el resto: el script de shell que se muestra aquí ciertamente no es seguro de usar y está bien probado. ¡Úselo bajo su propio riesgo!
Escribí un script bash para lograr esa tarea. Suponga que su biblioteca es lib1 y de la que necesita incluir algunos símbolos es lib2. El script ahora se ejecuta en un bucle, donde primero verifica qué símbolos indefinidos de lib1 se pueden encontrar en lib2. Luego extrae los archivos de objetos correspondientes de lib2 con
ar
, los renombra un poco y los coloca en lib1. Ahora puede haber más símbolos faltantes, porque las cosas que incluiste de lib2 necesitan otras cosas de lib2, que aún no hemos incluido, por lo que el ciclo debe ejecutarse nuevamente. Si después de algunas pasadas del bucle ya no hay cambios, es decir, no se agregaron archivos de objetos de lib2 a lib1, el bucle puede detenerse.Tenga en cuenta que los símbolos incluidos todavía se informan como indefinidos
nm
, por lo que estoy haciendo un seguimiento de los archivos de objetos, que se agregaron a lib1, ellos mismos, para determinar si el ciclo se puede detener.Llamé a ese script
libcomp
, así que puedes llamarlo entonces, por ejemplodonde libwhatever es donde desea incluir símbolos. Sin embargo, creo que es más seguro copiar primero todo en un directorio separado. No confiaría tanto en mi script (sin embargo, funcionó para mí; podría incluir libgsl.a en mi biblioteca de números con eso y omitir ese cambio de compilador -lgsl).
fuente