Liaison avec libpng & zlib?

j'essaie de compiler un projet qui utilise à la fois libjpeg et libpng. Je sais que libpng a besoin de zlib, donc j'ai compilé les trois indépendamment et les mettre (libjpeg.une, libpng.un et libz.a) sur un dossier appelé linrel32. Ce que j'execute alors est:

g++ -Llinrel32/ program.cpp otherfile.cpp -o linrel32/executable -Izlib/ -Ilpng140/ -Ijpeg/ -lpthread -lX11 -O2 -DLINUX -s -lz -lpng -ljpeg

donc j'inclus les trois bibliothèques. Pourtant, le linker se plaint:

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':

(... vous avez l'idée :D)

collect2: ld returned 1 exit status

je sais que les fonctions manquantes sont de zlib, et Je suis en ajoutant zlib. Libz ouverte.un et il semble avoir une bonne structure. Recompilé, tout semble parfait. Mais il ne l'est pas...

je ne sais pas, est probable que le problème est trivial, et j'ai besoin de dormir. Mais encore, si vous pouviez m'aider à comprendre cette chose ...

19
demandé sur huff 2010-03-07 08:52:36

2 réponses

vous devez réorganiser l'ordre des bibliothèques:

-lpng -ljpeg -lz

ce qui se passe, c'est que le linker a des règles spéciales sur la façon dont il traite les bibliothèques statiques. Ce qu'il fait c'est qu'il ne comprend .o à partir de l'intérieur de l' .une si la .o est nécessaire pour satisfaire à une référence.

de plus, il gère les archives statiques dans l'ordre où elles apparaissent sur la ligne de lien.

ainsi, votre code n'appelle directement aucune fonction dans zlib. Donc quand le linker manipule - d'abord, il n'y a pas encore d'appels pour que ça n'attire pas zlib.

ensuite, lorsque le linker gère libpng, il voit qu'il y a des appels vers libpng à partir de votre code. Donc il tire le code de libpng et puisqu'il fait des appels vers zlib, maintenant il y a des références aux fonctions zlib.

Maintenant vous arrivez à la fin de vos bibliothèques et il y a des appels insatisfaits qui causent votre erreur.

donc, si libhigh.un fait usage de liblow.un, vous devez disposer d' -lhigh avant-llow dans votre ordre de liaison.

38
répondu R Samuel Klatchko 2010-03-07 06:09:36

vous devez probablement entourer les en-têtes zlib et png avec extern "C", e.g.:

extern "C" {
#include <zlib.h>
}
-2
répondu 2010-03-07 05:59:37