25

libjpegとlibpngの両方を使用するプロジェクトをコンパイルしようとしています。libpngにはzlibが必要なことを知っているので、3つすべてを個別にコンパイルし、それら(libjpeg.a、libpng.a、libz.a)を.というフォルダーに配置しましたlinrel32。次に実行するのは次のとおりです。

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

したがって、3つのライブラリを含めます。それでも、リンカーは次のように文句を言います。

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

(...あなたはアイデアを得る:D)

collect2: ld returned 1 exit status

不足している関数がzlibからのものであることはわかっているので、そこにzlibを追加しています。libz.aを開きましたが、構造が良好なようです。それを再コンパイルすると、すべてが正常に見えます。そうではありません...

わかりませんが、問題は些細なことである可能性が高く、私が必要としているのはしばらく眠ることです。しかし、それでも、あなたが私がこのことを理解するのを手伝ってくれるなら...

4

2 に答える 2

50

ライブラリの順序を並べ替える必要があります。

-lpng -ljpeg -lz

何が起こっているのかというと、リンカには静的ライブラリの処理方法に関する特別なルールがあります。参照を満たすために.oが必要な場合は、.aの内側からの.oのみが含まれます。

さらに、静的アーカイブをリンク行に表示される順序で処理します。

したがって、コードはzlibの関数を直接呼び出すことはありません。したがって、リンカが最初に-lzを処理するとき、まだ呼び出しがないため、zlibはプルされません。

次に、リンカがlibpngを処理すると、コードからの呼び出しがあることがわかります。したがって、libpngからコードをプルし、zlibを呼び出すため、zlib関数への参照があります。

これでライブラリの最後に到達し、エラーの原因となる不満足な呼び出しがあります。

したがって、libhigh.aがliblow.aを使用する場合は、リンクの順序で-lhigh 前に持っている必要があります。 -llow

于 2010-03-07T06:03:33.837 に答える
-2

おそらく、zlibヘッダーとpngヘッダーを次のように囲む必要がありますextern "C"

extern "C" {
#include <zlib.h>
}
于 2010-03-07T05:59:37.730 に答える