我正在尝试编译一个同时使用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,它似乎有一个良好的结构。重新编译它,一切看起来都很好。但它不是..。
我不知道,这个问题很可能是微不足道的,我需要的是睡一段时间。但如果你能帮我弄清楚这件事..。
发布于 2010-03-07 06:03:33
您需要重新排列库的顺序:
-lpng -ljpeg -lz正在发生的事情是,链接器对于如何对待静态库有特殊的规则。它所做的是,如果需要.o来满足引用,则它只包含来自.a内部的.o。
此外,它按照静态档案出现在链接线上的顺序处理它们。
因此,您的代码不会直接调用zlib中的任何函数。因此,当链接器首先处理-lz时,还没有任何对它的调用,因此它不会引入任何zlib。
接下来,当链接器处理libpng时,它会看到代码中对它的调用。因此,它从libpng中提取代码,并且由于它调用zlib,所以现在有对zlib函数的引用。
现在,您将结束您的库,并且有一些不满意的调用会导致您的错误。
因此,如果libhigh.a使用libu.a,则必须按照链接顺序在-lhigh 之前使用 -llow。
https://stackoverflow.com/questions/2395355
复制相似问题