Gentoo 系統升級將 libpng 從 1.4 升級至 1.5 後,因 API 變更(結構體隱藏、符號移除),導致部分套件(如 libgda、opencv、wxPython)無法編譯。本文提供兩個典型案例的修正方法。
原因:.la 檔案(libtool 依賴描述)中仍硬編碼 -lpng14。
解決步驟:
-lpng14 的 .la 檔:grep -r '\-lpng14' /usr/lib64/*.la-lpng14 改為 -lpng15(或 -lpng)。原因:libpng 1.5 隱藏了內部結構,原程式碼透過 png.h 間接依賴 zlib 定義的巨集,現失效。
解決:為 grfmt_png.cpp 強制加入 zlib.h
--- modules/highgui/src/grfmt_png.cpp.old
+++ modules/highgui/src/grfmt_png.cpp
@@ -55,6 +55,7 @@
#include
#else
#include
+#include
#endif
#include "grfmt_png.hpp"
建立 local ebuild 套用此 patch,重新 emerge opencv。
同樣因結構體隱藏導致大量直接存取結構體欄位的程式碼失效,且無現成 patch,需等待上游修正或自行移植。
libpng 大版本升級屬重大變更,建議升級前先閱讀 emerge -pv @preserved-rebuild 輸出,並準備好對關鍵套件打 patch 或降級 libpng 過渡。
