如何正确安装 libpng?

Posted

技术标签:

【中文标题】如何正确安装 libpng?【英文标题】:How to install libpng correctly? 【发布时间】:2014-10-22 02:04:24 【问题描述】:

我正在尝试在我的 C 代码中访问 png 像素数据。我找到了这个库libpng。我从这个站点下载了最新版本,我使用的是 Ubuntu 14.04。我按照安装文件中的说明进行操作。一切顺利。然后我尝试用 gcc 编译这段code。但我收到了这个:

/tmp/ccWa9LDO.o: In function `read_png_file':
test.c:(.text+0x13c): undefined reference to `png_sig_cmp'
test.c:(.text+0x16f): undefined reference to `png_create_read_struct'
test.c:(.text+0x1a0): undefined reference to `png_create_info_struct'
test.c:(.text+0x1db): undefined reference to `png_set_longjmp_fn'
test.c:(.text+0x20c): undefined reference to `png_init_io'
test.c:(.text+0x220): undefined reference to `png_set_sig_bytes'
test.c:(.text+0x239): undefined reference to `png_read_info'
test.c:(.text+0x252): undefined reference to `png_get_image_width'
test.c:(.text+0x271): undefined reference to `png_get_image_height'
test.c:(.text+0x290): undefined reference to `png_get_color_type'
test.c:(.text+0x2af): undefined reference to `png_get_bit_depth'
test.c:(.text+0x2c4): undefined reference to `png_set_interlace_handling'
test.c:(.text+0x2e3): undefined reference to `png_read_update_info'
test.c:(.text+0x2fc): undefined reference to `png_set_longjmp_fn'
test.c:(.text+0x36f): undefined reference to `png_get_rowbytes'
test.c:(.text+0x3b2): undefined reference to `png_read_image'
/tmp/ccWa9LDO.o: In function `write_png_file':
test.c:(.text+0x430): undefined reference to `png_create_write_struct'
test.c:(.text+0x461): undefined reference to `png_create_info_struct'
test.c:(.text+0x49c): undefined reference to `png_set_longjmp_fn'
test.c:(.text+0x4cd): undefined reference to `png_init_io'
test.c:(.text+0x4e6): undefined reference to `png_set_longjmp_fn'
test.c:(.text+0x559): undefined reference to `png_set_IHDR'
test.c:(.text+0x572): undefined reference to `png_write_info'
test.c:(.text+0x58b): undefined reference to `png_set_longjmp_fn'
test.c:(.text+0x5bf): undefined reference to `png_write_image'
test.c:(.text+0x5d8): undefined reference to `png_set_longjmp_fn'
test.c:(.text+0x607): undefined reference to `png_write_end'
/tmp/ccWa9LDO.o: In function `process_file':
test.c:(.text+0x692): undefined reference to `png_get_color_type'
test.c:(.text+0x6be): undefined reference to `png_get_color_type'
test.c:(.text+0x6db): undefined reference to `png_get_color_type'
collect2: error: ld returned 1 exit status

我不明白,因为我希望如果安装有问题,我会因为包含png.h 而收到错误。

【问题讨论】:

你安装了 libpng12-dev 吗? sudo apt-get install libpng12-dev 在开发中使用它所需的文件通常在 Debian 及其衍生产品的 -dev 包中。 您似乎没有链接到 libpng 库。 @deepy 这些通常是头文件。 OP 有一个链接器错误,而不是编译器错误。 准确显示您的编译命令。 gcc 的参数顺序很重要! 对不起,我刚开始在linux下写,我刚用gcc my_code.c。 @TheParamagneticCroissant 链接 libpng 库是什么意思? 【参考方案1】:

我认为您只安装了 PNG 处理库。您将必须安装可以引用已安装库的头文件。所以安装'dev'包也像这样

 sudo apt-get install libpng12-dev 

【讨论】:

他显然有头文件,因为他通过编译。这是失败的链接。【参考方案2】:

你在cmets中说你用gcc my_code.c,试试

gcc my_code.c -lpng

-l 标志链接一个库,在本例中为 libpng12-dev

链接意味着您的编译器添加来自所有目标文件的代码以创建单个可执行文件。目标文件是单独编译的源代码文件(.o 文件)。

【讨论】:

谢谢,这有助于编译。现在我在运行程序时遇到问题。我收到此错误消息:./a.out: error while loading shared libraries: libpng16.so.16: cannot open shared object file: No such file or directory 我认为那里的数字仅代表该库的版本。当我尝试gcc my_code.c -lpng12 时,我得到以下几行:test.c:(.text+0x1db): undefined reference to `png_set_longjmp_fn'。我也试过gcc my_code.c -lpng16,上面comnent的错误仍然存​​在。 是的,它确实只解决了版本问题,如果你从源代码编译 libpng 1.6 并使用我在回答中说的命令尝试它呢? 我猜我是从源代码编译的,我是通过 make install 完成的,而不是 apt-get install。 您可以使用find /usr/lib -name *png*找到位置,然后使用gcc my_code.c -L<location> -lpng16【参考方案3】:

我的英语不太好,但我会尽力帮助你。 这个问题我用了2天左右,解决方法很简单,让我们看看。

尝试这样做:gcc my_code.c -lpng 之后你会得到一些像a.out这样的文件,然后你需要在同一目录中有一些图片png

之后,输入:./a.out png_file.png res.png

输出文件将被称为res.png

【讨论】:

以上是关于如何正确安装 libpng?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 MSYS2 上安装 libpng?

如何在 Windows 上安装 libpng-dev?

Lua 错误加载模块 'libpng' (Torch, MacOSX)

使用 libpng 编写 1 位深度的灰度 PNG 会导致图像不正确

没有找到libpng13.dll,因此这个程序未能启动.重新安装应用程序可能会修复些问题.

libpng 警告:iCCP:已知不正确的 sRGB 配置文件