gpt4 book ai didi

g++ - 与 libpng 和 zlib 链接?

转载 作者:行者123 更新时间:2023-12-02 03:11:43 25 4
gpt4 key购买 nike

我正在尝试编译一个同时使用 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,看起来结构不错。重新编译一下,一切看起来都很好。但事实并非如此……

我不知道,可能这个问题是微不足道的,我需要的是睡一会儿。但是,如果你能帮我解决这个问题......

最佳答案

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

-lpng -ljpeg -lz

发生的情况是链接器对于如何处理静态库有特殊的规则。它的作用是,如果需要 .o 来满足引用,则它仅包含 .a 内部的 .o。

此外,它按照静态文件在链接行上出现的顺序处理它们。

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

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

现在您到达了库的末尾,并且存在未满足的调用,这会导致您的错误。

因此,如果 libhigh.a 使用 liblow.a,则链接顺序中必须有 -lhigh before -llow

关于g++ - 与 libpng 和 zlib 链接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2395355/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com