Ubuntu环境下PNGwriter安装、C++像素级生成RGB/HSV格式PNG图像及编译链接问题求助
我来一步步帮你解决这些问题,先从基础疑问开始,再搞定你卡壳的编译链接错误:
基础疑问解答
1. 如何判断PNGwriter是否安装到系统路径?
/usr/local/include 和 /usr/local/lib 属于系统默认搜索路径(编译器和链接器会自动扫描这些目录),所以你的PNGwriter已经成功安装到系统路径了,完全不需要额外设置CMAKE_PREFIX_PATH环境变量。
2. 环境变量相关问题
- 直接在终端输入的环境变量只对当前终端会话有效,每次新开终端都得重新输入;如果想永久生效,需要添加到
~/.bashrc(bash环境)或~/.zshrc(zsh环境)这类shell配置文件里,添加后执行source ~/.bashrc就能立即生效。 - 你这里因为已经安装到系统默认路径,所以不需要设置这个变量。如果是自定义安装路径,
somepath指的是你安装PNGwriter的根目录(比如$HOME/my-pngwriter,CMake会自动在这个目录下查找include和lib子目录)。
3. CMakeLists.txt相关问题
- CMakeLists.txt是CMake构建工具的配置文件,用来定义项目的编译规则、依赖库、输出路径等,不是IDE专属生成的,你可以手动创建。
- 如果你只有单个源码文件,完全不需要用CMake,直接用g++手动编译就行,这也是你现在尝试的方式,更简单直接。
解决编译链接错误
阶段1:替换freetype依赖的获取方式
你之前遇到的ft2build.h找不到、freetype2.pkg报错问题,虽然安装了libfreetype6-dev,但freetype-config工具存在兼容性问题。建议换成pkg-config来自动获取freetype的编译和链接参数,更可靠:
把原来的freetype-config --cflags替换成pkg-config freetype2 --cflags --libs,这样能同时搞定编译头文件路径和链接库的问题。
阶段2:修正链接顺序与符号缺失问题
链接器的库顺序非常关键:依赖其他库的库必须放在被依赖库的前面。从你的错误来看,libPNGwriter依赖libpng,所以要把-lPNGwriter放在-lpng前面;另外,你遇到的png_convert_to_rfc1123_buffer和png_set_longjmp_fn符号缺失,大概率是因为PNGwriter链接了旧版本的libpng,重新安装最新版libpng并重新编译PNGwriter就能解决。
最终可用的编译命令
g++ example.cpp -o example $(pkg-config freetype2 --cflags --libs) -I/usr/local/include -L/usr/local/lib -lPNGwriter -lpng -lz
命令解释:
$(pkg-config freetype2 --cflags --libs):自动获取freetype的编译头文件路径和链接参数,避免手动指定出错-lPNGwriter放在-lpng前面:确保链接器先解析PNGwriter的依赖,再找libpng的符号-lz是zlib的链接库,libpng依赖它,必须保留
解决libpng版本问题(如果上述命令仍报错)
先重新安装最新版的libpng-dev:
sudo apt update && sudo apt install --reinstall libpng-dev
然后重新编译安装PNGwriter,确保它链接到最新的libpng:
cd pngwriter-build sudo make uninstall cmake ../pngwriter -DCMAKE_BUILD_TYPE=Release make -j$(nproc) sudo make install
在NetBeans中配置PNGwriter
- 打开你的NetBeans C++项目,右键点击项目 → Properties
- 在左侧菜单选择Build → C++ Compiler:
- 在Include Directories里添加
/usr/local/include(如果NetBeans没自动识别的话)
- 在Include Directories里添加
- 然后选择Build → Linker:
- 在Additional Library Directories添加
/usr/local/lib - 在Libraries里按顺序添加
PNGwriter、png、z、freetype(和终端编译的顺序一致,PNGwriter在前)
- 在Additional Library Directories添加
- 点击OK保存配置,重新编译项目即可。
问题根源总结
你的问题主要来自三个方面:
- 编译命令中库的链接顺序错误,导致依赖解析失败
freetype-config工具的兼容性问题,换成pkg-config更稳定- 之前安装的PNGwriter可能链接了旧版本的libpng,重新安装即可解决符号缺失问题
内容的提问来源于stack exchange,提问作者Petri Hirvonen

