2012-07-26 18 views
7

He estado usando libarchive en mi proyecto desde hace un tiempo y está funcionando muy bien, en este momento estoy vinculándolo dinámicamente, por lo que en Windows el archivo libarchive.dll tiene que presentar en el sistema. Ahora me gustaría vincular estáticamente a la biblioteca, así que no tengo que molestarme en distribuir el archivo DLL, ¡pero estoy teniendo problemas para tratar de lograrlo!Vinculando estáticamente a libarchive en Windows con MinGW

Actualmente, en mi archivo de maquillaje, tengo algo como esto: -Lpath/a // libarchive/-larchive

Y esto funciona, pero lo hace un vínculo dinámico. No sé cómo hacer cumplir un enlace estático.

Puedo ver en el directorio libarchive hay dos archivos a, libarchive.dll.a y libarchive_static.a. Supongo que quiero hacer un enlace a libarchive_static.a, pero parece que no puedo especificarlo, haciendo que -larchive_static en el archivo make produzca errores en el enlazador.

Tenía la impresión de que las bibliotecas estáticas en windows son archivos lib, pero no obtengo ese tipo de archivo cuando construyo libarchive.

¿Cómo puedo hacer un archivo .lib de libarchive. Además, como pregunta adicional, ¿cuál es la diferencia entre un archivo a y un archivo lib?

actualización

Para enlazar a estáticamente libarchive, el comando de la biblioteca para el maquillaje debe contener:

-Lpath/a // libarchive/-larchive_static

Esto vinculará a la libarchive_static. un archivo. Sin embargo, también necesita definir LIBARCHIVE_STATIC en su código.

Ahora el problema es que libarchive depende de las bibliotecas bzip2 (así como otros), y si usted no tiene una acumulación estática de ellos se producirán errores de vinculador algo como:

referencia indefinida a `BZ2_bzCompressInit '

Usted necesita una acumulación estática de las bibliotecas dependientes y un comando similar al enlazador después el comando libarchive:

-Lpath/a/bzip2/-lbzip2

Usted puede construir bzip2 de la fuente, o hacerlo de la manera fácil y obtener un binario pre-construidos a partir del proyecto Gnu32Win aquí: http://gnuwin32.sourceforge.net/packages.html

+1

Gracias por la nota para definir LIBARCHIVE_STATIC. –

Respuesta

3

Sólo añadir libarchive_static.a explícitamente a su comando de enlace.

gcc -o YourApp.exe $(OBJS) path/to/libarchive_static.a $(OtherLibs) 

archivos .lib "" difieren de compilador de compilador (Borland, Microsoft, etc.), ".a" es un formato antiguo "archivo" de la herramienta de UNIX ar. Ahora se usa solo para agrupar bibliotecas estáticas.

Actualmente, en mi archivo de marca, tengo algo ... y esto funciona, pero tiene un vínculo dinámico

El archivo .a en realidad contiene algo de código para la vinculación dinámica en el archivo .dll, no el libarchive sí. En el inicio, se asignan los punteros a las funciones y se realiza el enlace dinámico.

+0

Acabo de probar esto, recibo errores del enlazador diciendo que las funciones que estoy usando en la biblioteca tienen referencias no definidas. ¿Qué implicaría eso? – oggmonster

+3

Esto implica que libarchive depende de otra cosa. Apuesto a que son zlib, libzip2, etc. ¿Tienes versiones estáticas de estos? Obtenga los archivos .a y agréguelos _after_ libarchive_static.a a su comando de compilación –

+0

Sí, tiene razón, he actualizado mi pregunta de acuerdo. Voy a intentar esto más tarde, gracias! – oggmonster