与libpng&链接zlib的?

时间:2010-03-07 05:52:37

标签: g++ zlib libpng

我正在尝试编译一个同时使用libjpeg和libpng的项目。我知道libpng需要zlib,所以我将所有三个独立编译并将它们(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

所以我包括了三个库。仍然,链接器抱怨:

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,似乎有一个很好的结构。重新编译它,一切看起来都很好。但它不是......

我不知道,问题很可能是微不足道的,我需要的是睡一会儿。但是,如果你能帮助我搞清楚这件事......

2 个答案:

答案 0 :(得分:42)

您需要重新排列库的顺序:

-lpng -ljpeg -lz

正在发生的事情是链接器对如何处理静态库有特殊规则。它的作用是它只包含.a中的.o,如果需要.o来满足参考。

此外,它按照它们在链接线上显示的顺序处理静态存档。

因此,您的代码不会直接调用zlib中的任何函数。因此,当链接器首先处理-lz时,还没有任何调用它,因此它不会引入任何zlib。

接下来,当链接器处理libpng时,它会看到代码中有对它的调用。所以它从libpng中提取代码,因为它调用zlib,现在有对zlib函数的引用。

现在你走到你的库的末尾,并且有不满意的调用导致你的错误。

因此,如果libhigh.a使用了liblow.a,则必须在链接顺序中 -lhigh之前使用-llow

答案 1 :(得分:-2)

你可能需要用extern "C"包围zlib和png标题,例如:

extern "C" {
#include <zlib.h>
}