Pregunta

Estoy cansado de la adición de diez bibliotecas de vínculos en mi proyecto, o que requieren ocho de ellos a mi.Me gustaría tomar bibliotecas existentes como libpng.una, libz.una, libjpeg.una, y combinarlos en uno solo .una biblioteca.Es eso posible?Cómo acerca de la combinación .lib bibliotecas?

¿Fue útil?

Solución

En sistemas Unix, el ld y ar utilidades puede hacer esto.Echa un vistazo http://en.wikipedia.org/wiki/Ar_(Unix) o de búsqueda de las páginas de manual en cualquier cuadro de linux o a través de google, el correo.g 'unix hombre ar'.

Por favor, tenga en cuenta que usted puede ser mejor de vincular a una compartido (dinámica) de la biblioteca.Esto habría que agregar una dependencia a su ejecutable, pero va a reducir drásticamente su tamaño, especialmente si usted está escribiendo una aplicación gráfica.

Otros consejos

Se podrían extraer los archivos objeto de cada una de las bibliotecas con

ar x <library name>

y, a continuación, combinar todos ellos en una nueva biblioteca con

ar cs <new library name> <list each extracted object file>

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 usted puede mantener la existencia de liba.a y libb.a:

ar crsT libab.a liba.a libb.a

En Windows, con MSVC de las herramientas:

lib.exe /OUT:libab.lib liba.lib libb.lib

Tal vez soy un malentendido, pero no sólo tiene que enviar el libs si el usuario final código llama a ellos directamente?Si todo el acceso a Jpeg métodos, etc es a partir de su código en la biblioteca estática, a continuación, sólo enlace de la libs en su lib.

I. e.

----------------
| End-user exe |
----------------
      |
      | makes calls to
      |
      v
 --------------------
 | Your static lib.a | 
 --------------------
         | makes calls to and links
         v
     ------------------------------------ .....
     |                    |         |
  -------------    -------- ---------- 
  | libjpeg.a |    |libz.a| |libpng.a|
  -------------    -------- ----------

I. e es sólo un problema si el código de fin de necesidades para realizar llamadas directas en libz.una, libpng.un etc.

Si el código de la aplicación tiene una necesidad legítima para llamar libz.una, por ejemplo, a continuación, que como se mencionó anteriormente un caso para el uso de un módulo dinámico.

PS:Obtengo los artistas insignia?:)

No estoy seguro de cómo físicamente combinarlos en un solo archivo, sin embargo, usted podría emplear una abstracción de una especie y sólo incluir un único "AllMyLibs.a/h", que a su vez incluye todo lo que usted desea.También podría poner esto en la ubicación donde el compilador busca las bibliotecas, por lo que para cualquier proyecto.

P. S.- Por curiosidad, ¿por qué no le gusta como única libs?

La combinación de varias bibliotecas de terceros en la que uno podría crear más problemas para usted, por ejemplo, si dos de esas bibliotecas definir un símbolo común que el programa no se utilice.Ahora tienes que extraer todos (o todos-pero-uno) de las instancias del símbolo común antes de combinar las bibliotecas.

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