g++ - como - ¿Enlazando con libpng y zlib?
libpng install windows (2)
Estoy tratando de compilar un proyecto que usa tanto libjpeg como libpng. Sé que libpng necesita zlib, así que compilé los tres de forma independiente y los puse (libjpeg.a, libpng.a y libz.a) en una carpeta llamada linrel32
. Lo que ejecuto entonces es:
g++ -Llinrel32/ program.cpp otherfile.cpp -o linrel32/executable -Izlib/ -Ilpng140/ -Ijpeg/ -lpthread -lX11 -O2 -DLINUX -s -lz -lpng -ljpeg
Así que incluyo las tres bibliotecas. Aún así, el enlazador se queja:
linrel32//libpng.a(png.o): In function `png_calculate_crc'':
png.c:(.text+0x97d): undefined reference to `crc32''
linrel32//libpng.a(png.o): In function `png_reset_crc'':
png.c:(.text+0x9be): undefined reference to `crc32''
linrel32//libpng.a(png.o): In function `png_reset_zstream'':
png.c:(.text+0x537): undefined reference to `inflateReset''
linrel32//libpng.a(pngread.o): In function `png_read_destroy'':
pngread.c:(.text+0x6f4): undefined reference to `inflateEnd''
linrel32//libpng.a(pngread.o): In function `png_read_row'':
pngread.c:(.text+0x1267): undefined reference to `inflate''
linrel32//libpng.a(pngread.o): In function `png_create_read_struct_2'':
(... te dan la idea: D)
collect2: ld returned 1 exit status
Sé que las funciones que faltan son de zlib, y estoy agregando zlib allí. Se abrió libz.a y parece tener una buena estructura. Recompilado, todo se ve bien. Pero no lo es...
No sé, es probable que el problema sea trivial, y lo que necesito es dormir un rato. Pero aún así, si pudieras ayudarme a resolver esto ...
Es necesario reorganizar el orden de las bibliotecas:
-lpng -ljpeg -lz
Lo que sucede es que el enlazador tiene reglas especiales sobre cómo trata las bibliotecas estáticas. Lo que hace es que solo incluye un .o desde dentro de .a si se necesita .o para satisfacer una referencia.
Además, maneja archivos estáticos en el orden en que aparecen en la línea de enlace.
Por lo tanto, su código no llama directamente a ninguna función en zlib. Entonces, cuando el enlazador maneja primero -lz, todavía no hay ninguna llamada para que no tire de zlib.
Luego, cuando el vinculador maneja libpng, ve que hay llamadas desde su código. Así que extrae el código de libpng y como hace llamadas a zlib, ahora hay referencias a las funciones de zlib.
Ahora llega al final de sus bibliotecas y hay llamadas insatisfechas que causan su error.
Por lo tanto, si libhigh.a hace uso de liblow.a, debe tener -lhigh
before -llow
en su orden de enlace.
probablemente deba rodear los encabezados zlib y png con extern "C"
, por ejemplo:
extern "C" {
#include <zlib.h>
}