早上例行eix-sync,然后emerge -Duav world。
升级完系统之后,就提示libpng升级了,需要重新emerge @preserved-rebuild
悲剧的是,很多包完全编译不过了,这几记录下部分包的解决方案:
1、gnome-extra/libgda编译失败
在链接的时候,会提示-lpng14找不到,很明显是因为libpng升级到1.5导致的。但是,搜索了libgda里面的所有Makefile文件,都没有发现有地方写名链接libpng14这个动态链接库的地方。最后找到的原因是因为/usr/lib64/目录中有很多xxx.la文件,是libtool用来管理依赖用的,其中有些动态链接库里面的依赖写名了-lpng14。
找到了原因,解决起来就方便了。首先通过grep命令找到所有写死-lpng14的地方,重新emerge这些库。不过这里发现有些库重新emerge了,依赖还是没有纠正。最后通过手工改这些文件,改成-lpng15。
重新emerge就OK了。
2、opencv编译失败
opencv编译失败,提示的是error: ‘MAX_MEM_LEVEL’ was not declared in this scope等错误。google了下,是因为libpng1.5.x将原先暴露出来的png文件结构都隐藏了,头文件里面只有一个预先声明和一堆typedef。这些应该是原来在定义这些png图片结构的时候,依赖的zlib,现在没法间接依赖了。
解决方法当然就是写个补丁,强制modules/highgui/src/grfmt_png.cpp这个文件include zlib.h这个头文件,补丁内容如下:
--- modules/highgui/src/grfmt_png.cpp.old 2011-09-19 19:36:49.759516862 +0800
+++ modules/highgui/src/grfmt_png.cpp 2011-09-19 19:28:04.302185712 +0800
@@ -55,6 +55,7 @@
#include <libpng/png.h>
#else
#include <png.h>
+#include <zlib.h>
#endif
#include "grfmt_png.hpp"
自己写个local portage,编译好了opencv
另外还有wxPython,这个目前真没办法了,也是因为libpng1.5.x隐藏了png图片结构体,导致原来直接通过结构体指针访问结构体内容全部出错,貌似没看见补丁,再说了。
截止发博时@preserved-rebuild这个set里面的还没有全部重新编译完,希望不要再有大问题了。