与 libpng 和 zlib 链接?
Posted
技术标签:
【中文标题】与 libpng 和 zlib 链接?【英文标题】:Linking with libpng & zlib? 【发布时间】:2011-01-24 14:51:58 【问题描述】:我正在尝试编译一个同时使用 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,它似乎有一个很好的结构。重新编译它,一切看起来都很好。但不是……
我不知道,可能是小问题,我需要的是睡一会儿。不过,如果你能帮我弄清楚这件事……
【问题讨论】:
【参考方案1】:您需要重新排列库的顺序:
-lpng -ljpeg -lz
正在发生的事情是链接器对如何处理静态库有特殊的规则。它的作用是,如果需要 .o 来满足引用,则它只包含 .a 内部的 .o。
此外,它会按照它们在链接行上出现的顺序处理静态存档。
因此,您的代码不会直接调用 zlib 中的任何函数。因此,当链接器首先处理 -lz 时,还没有对它的任何调用,因此它不会拉入任何 zlib。
接下来,当链接器处理 libpng 时,它会看到您的代码中有对它的调用。因此它从 libpng 中提取代码,并且由于它调用 zlib,所以现在有对 zlib 函数的引用。
现在你的库已经走到尽头了,有一些不满意的调用会导致你的错误。
因此,如果 libhigh.a 使用 liblow.a,您的链接顺序中必须有-lhigh
之前 -llow
。
【讨论】:
谢谢。你是绝对正确的。我认为命令是一种可能性,但我没有任何真正的理由支持这个理论。我误以为是链接器把所有东西都放到了一个“池子”里,然后在跟踪每段代码后把没用的函数去掉了。 @huff - 不客气。仅供参考,订单只对静态档案很重要;如果您使用共享对象,那没关系。 现在混合例如CMake 和乐趣变得更大(尤其是在传递 VERBOSE=1 之前)。 zlib 是静态库吗?我对依赖于 zlib 的 boost::iostreams 有类似的问题;它在我的机器上失败,但在其他机器上没有。无论如何 - 这是一个很好的经验法则 - 最“基本”的依赖关系排在最后。 难以置信 - 30 分钟的痛苦 - 最终如此简单。 @MoonKnight - 很高兴我的回答在 11 年后仍在帮助人们。【参考方案2】:您可能需要用 extern "C"
包围 zlib 和 png 标头,例如:
extern "C"
#include <zlib.h>
【讨论】:
这是不正确的。如果是这种情况,您会看到像undefined reference to: "crc32(unsigned long, char const*, unsigned int)"
这样的错误,而不仅仅是 undefined reference to: "crc32"
以上是关于与 libpng 和 zlib 链接?的主要内容,如果未能解决你的问题,请参考以下文章