Linux 64位系统交叉编译32位libcairo-1.14.2出现重定义错误如何解决
错误根因
该报错属于cairo 1.14.2版本与高版本系统Xrender头文件的兼容性问题:cairo 1.14.2发布时Xrender官方还未内置_XLinearGradient等梯度结构定义,因此cairo在私有头文件cairo-xlib-xrender-private.h中自行补充了这些定义;而当前你使用的64位Linux系统自带的Xrender开发包版本较高,头文件/usr/include/X11/extensions/Xrender.h已经官方实现了这部分结构,二者重复定义触发编译错误。
另外你之前的编译参数存在两处错误,也会加剧头文件查找异常:
- configure参数中等号两侧不允许加空格,会导致参数识别失败
--build参数应填写当前宿主机的64位架构(x86_64-linux-gnu),填写i386会导致configure错误识别编译环境,优先读取64位头文件
解决步骤
- 第一步:安装32位依赖库
确保系统已安装32位版本的X11、Xrender开发包,避免编译时找不到32位依赖回退使用cairo内部定义:
Debian/Ubuntu系执行:
RHEL/CentOS/Fedora系执行:sudo apt install libx11-dev:i386 libxrender-dev:i386sudo yum install libX11-devel.i686 libXrender-devel.i686 - 第二步:修改cairo源码头文件移除重复定义
打开源码目录下的src/cairo-xlib-xrender-private.h文件,找到第106行开始的struct _XLinearGradient、struct _XRadialGradient、struct _XConicalGradient三个结构的定义和typedef声明,直接删除这部分重复代码,或者在这段代码前后加版本判断宏:#if XRENDER_MAJOR < 0 || (XRENDER_MAJOR == 0 && XRENDER_MINOR < 10) /* 原有三个梯度结构的定义代码放在此处 */ #endif - 第三步:修正编译配置命令
先清理之前的编译缓存:
再执行正确的configure命令,注意参数无空格、指定32位编译链接参数、指定32位pkgconfig路径(以下路径为Debian系示例,RHEL系32位pkgconfig路径为make distclean/usr/lib/pkgconfig,可自行调整):./configure --prefix="/usr/work/libcairo-1.14.2/compiled/" --host=i686-pc-linux-gnu --build=x86_64-linux-gnu CFLAGS="-m32 -O2" CXXFLAGS="-m32 -O2" LDFLAGS="-m32" PKG_CONFIG_PATH="/usr/lib/i386-linux-gnu/pkgconfig" - 第四步:编译安装
make -j$(nproc) make install
内容的提问来源于stack exchange,提问作者famedoro
相关产品推荐
相关产品推荐

