¿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?

 34
Author: Community, 2008-08-16

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.

 8
Author: Avner,
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>
 23
Author: Judge Maygarden,
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
 3
Author: Star Brilliant,
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? :)

 0
Author: Greg Whitfield,
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?

 0
Author: Ed.,
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.

 -1
Author: tuxedo,
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