librerias - manual completo de c++ pdf
¿Cómo combinar varias bibliotecas C/C++ en una sola? (6)
Estoy cansado de agregar diez bibliotecas de enlaces a mi proyecto, o de requerir que ocho de ellos usen el mío. Me gustaría tomar bibliotecas existentes como libpng.a, libz.a, libjpeg.a, y combinarlas en una única biblioteca .a. ¿Es eso posible? ¿Qué hay de la combinación de bibliotecas .lib?
Puede extraer los archivos objeto de cada biblioteca con
ar x <library name>
y luego fusionarlos a todos en una nueva biblioteca con
ar cs <new library name> <list each extracted object file>
Tal vez estoy malentendido, pero ¿no tienes que enviar las libs solo si el código del usuario final las llama directamente? Si todo el acceso a los métodos de Jpeg, etc. proviene de su código en su biblioteca estática, simplemente vincule las librerías en su lib.
Es decir
----------------
| End-user exe |
----------------
|
| makes calls to
|
v
--------------------
| Your static lib.a |
--------------------
| makes calls to and links
v
------------------------------------ .....
| | |
------------- -------- ----------
| libjpeg.a | |libz.a| |libpng.a|
------------- -------- ----------
Es decir, es solo un problema si el código final necesita realizar llamadas directas a libz.a, libpng.a, etc.
Si el código de la aplicación tiene una necesidad legítima de llamar a libz.a, por ejemplo, entonces sería como se mencionó anteriormente un caso para usar un módulo dinámico.
PD: ¿Obtengo una insignia de artista? :)
Combinar varias bibliotecas de terceros en una podría crear más problemas para usted, por ejemplo, si dos de esas bibliotecas definen un símbolo común que su programa no utiliza. Ahora debe extraer todas (o todas) una de las instancias del símbolo común antes de combinar las bibliotecas.
En sistemas como Unix, las utilidades ld y ar pueden hacer esto. Eche un vistazo a http://en.wikipedia.org/wiki/Ar_(Unix) o busque las páginas man en cualquier cuadro de Linux oa través de Google, por ejemplo, ''unix man ar''.
Tenga en cuenta que es mejor que se vincule a una biblioteca compartida (dinámica). Esto agregaría una dependencia a su ejecutable, pero reducirá drásticamente su tamaño, especialmente si está escribiendo una aplicación gráfica.
No estoy seguro de cómo combinarlos físicamente en un solo archivo, sin embargo, podría emplear una abstracción de un tipo y simplemente incluir un solo "AllMyLibs.a / h", que a su vez incluye todo lo que desea. También puede poner esto en la ubicación donde su compilador busca bibliotecas, por lo que funcionaría para cualquier proyecto.
PD: por curiosidad, ¿por qué no te gusta incluir libs individuales?
En Linux o MinGW o Cygwin, con la cadena de herramientas GNU:
ar -M <<EOM
CREATE libab.a
ADDLIB liba.a
ADDLIB libb.a
SAVE
END
EOM
ranlib libab.a
O si puede mantener la existencia de liba.a
y libb.a
:
ar crsT libab.a liba.a libb.a
En Windows, con la cadena de herramientas de MSVC:
lib.exe /OUT:libab.lib liba.lib libb.lib