¿Cómo combinar varias bibliotecas de C/C++ en una sola?
Estoy cansado de agregar diez bibliotecas de enlaces a mi proyecto, o requerir que ocho de ellas usen la mía. Me gustaría tomar bibliotecas existentes como libpng.a, libz.a, libjpeg.a, y combinarlos en uno solo .biblioteca. Es eso posible? ¿Qué tal combinar?lib bibliotecas?
6 answers
En sistemas tipo Unix, las utilidades ld y ar pueden hacer esto. Echa un vistazo http://en.wikipedia.org/wiki/Ar_ (Unix) o busque las páginas de manual en cualquier caja de Linux o a través de Google, por ejemplo 'unix man ar'.
Tenga en cuenta que podría ser mejor enlazar a una biblioteca compartida (dinámica). Esto añadiría una dependencia a su ejecutable, pero reducirá drásticamente su tamaño, especialmente si está escribiendo una aplicación gráfica.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-30 01:04:32
Puede extraer los archivos objeto de cada biblioteca con
ar x <library name>
Y luego fusionarlos todos en una nueva biblioteca con
ar cs <new library name> <list each extracted object file>
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-16 16:18:30
En Linux o MinGW o Cygwin, con GNU toolchain:
ar -M <<EOM
CREATE libab.a
ADDLIB liba.a
ADDLIB libb.a
SAVE
END
EOM
ranlib libab.a
O si se 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 MSVC:
lib.exe /OUT:libab.lib liba.lib libb.lib
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-15 13:13:26
Tal vez sea un malentendido, pero ¿no solo tienes que enviar las libs si el código de usuario final las llama directamente? Si todo el acceso a los métodos Jpeg, etc., proviene de su código en su biblioteca estática, simplemente vincule las bibliotecas a su biblioteca.
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, solo es un problema si end code necesita hacer 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 que como se mencionó anteriormente sería un caso para el uso de un módulo dinámico.
PD: ¿Obtengo una insignia de artista? :)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-22 10:32:09
No estoy seguro de cómo combinarlos físicamente en un solo archivo, sin embargo, podría emplear una abstracción de un tipo e incluir un solo "AllMyLibs".a / h " que a su vez incluye todo lo que quieras. También puede poner esto en la ubicación donde su compilador busca bibliotecas, para que funcione para cualquier proyecto.
P.d. - Por curiosidad, ¿por qué no te gusta incluir libs individuales?
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-25 16:34:34
Combinar varias bibliotecas de terceros en una podría crear más problemas para usted for por ejemplo, si dos de esas bibliotecas definen un símbolo común que su programa no usa. Ahora tienes que extraer todas (o todas menos una) de las instancias del símbolo común antes de combinar las bibliotecas.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-28 02:58:33