Ich versuche ein Projekt zu kompilieren, das sowohl libjpeg als auch libpng verwendet. Ich weiß, dass libpng zlib benötigt, also kompilierte ich alle drei unabhängig und legte sie (libjpeg.a, libpng.a und libz.a) in einen Ordner namens linrel32
. Was ich ausführen, dann ist:Verlinkung mit libpng & zlib?
g++ -Llinrel32/ program.cpp otherfile.cpp -o linrel32/executable -Izlib/ -Ilpng140/ -Ijpeg/ -lpthread -lX11 -O2 -DLINUX -s -lz -lpng -ljpeg
So schließe ich die drei Bibliotheken. Dennoch beklagt sich der Linker:
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':
(... Sie auf die Idee: D)
collect2: ld returned 1 exit status
weiß, dass ich die fehlenden Funktionen von zlib sind, und ich bin zlib Zugabe von dort. Eröffnet libz.a und es scheint eine gute Struktur zu haben. Neukompiliert, alles sieht gut aus. Aber es ist nicht ...
Ich weiß nicht, ist wahrscheinlich, dass das Problem trivial ist, und was ich brauche, ist für eine Weile zu schlafen. Aber dennoch, wenn Sie mir helfen können, diese Sache, um herauszufinden, ...
Danke. Du hast absolut recht. Ich dachte, dass die Reihenfolge eine Möglichkeit wäre, aber ich hatte keinen wirklichen Grund, diese Theorie zu unterstützen. Ich dachte fälschlicherweise, dass der Linker alles in einen "Pool" legte, und löschte dann die unbenutzten Funktionen, nachdem er jedes Stück Code verfolgt hatte. – huff
@huff - Gern geschehen. FYI, Bestellung nur für statische Archive; Wenn Sie geteilte Objekte verwenden, ist das egal. –
Jetzt mische z.B. CMake und der Spaß wird noch größer (vor allem vor dem Übergeben von VERBOSE = 1 zu machen). Ist zlib eine statische Bibliothek? Ich habe ein ähnliches Problem mit boost :: iostreams, die von zlib abhängen; es scheitert an meiner Maschine, aber nicht an anderen.Wie auch immer - das ist eine gute Faustregel - die meisten "grundlegenden" Abhängigkeiten kommen zuletzt. –