在64位Ubuntu 16.04中使用GNU Autotools交叉编译32位ImageMagick与Protobuf库的问题求助
解决Ubuntu 16.04下Autotools编译32位ImageMagick/Protobuf的问题
先给你梳理下你遇到的两个问题的核心原因:
- 第一种方法只给编译器加了
-m32参数,但没给链接器指定32位模式,再加上Ubuntu默认没装32位开发依赖包,才导致链接时出现文件格式不兼容的错误; - 第二种方法的交叉编译配置不完整:只指定了
--host参数,但没配套指定32位专属的编译器,configure最终还是调用了默认的64位工具链,所以编译出来的还是64位二进制。
第一步:先搭建完整的32位编译环境
Ubuntu 16.04默认关闭了i386架构支持,先开启并安装必要的工具和依赖:
# 启用i386架构支持 sudo dpkg --add-architecture i386 # 更新源并安装32位编译工具链 sudo apt-get update && sudo apt-get install gcc-multilib g++-multilib libc6-dev-i386 # 安装ImageMagick/Protobuf所需的32位依赖(按需补充) sudo apt-get install libpng-dev:i386 libjpeg-dev:i386 libtiff-dev:i386 zlib1g-dev:i386
方法一:修正-m32编译命令(无需交叉编译)
之前的命令遗漏了链接器的32位参数,必须把LDFLAGS="-m32"也加上,确保编译、链接全流程强制32位:
# 清理之前的编译残留,避免干扰 make clean && rm -rf config.log config.status # 配置并编译 ./configure CFLAGS="-m32" CXXFLAGS="-m32" LDFLAGS="-m32" && make
方法二:正确配置交叉编译(更严谨的32位构建)
如果想用交叉编译方式,必须指定对应i386的交叉编译器,Ubuntu的交叉工具链是i686-linux-gnu-前缀的,先安装:
sudo apt-get install gcc-i686-linux-gnu g++-i686-linux-gnu
然后用完整的configure命令,明确指定编译器和host参数:
make clean && rm -rf config.log config.status ./configure --build=x86_64-pc-linux-gnu --host=i686-pc-linux-gnu CC=i686-linux-gnu-gcc CXX=i686-linux-gnu-g++ && make
快速验证编译结果
不用手动解压静态库,直接用file命令就能快速确认:
file libMagick++.a
如果输出包含32-bit或i386/i686字样,就说明是正确的32位二进制了。
额外注意事项
- 每次尝试新配置前,一定要执行
make clean并删除config相关文件,避免残留的64位编译信息干扰; - Protobuf的编译流程和ImageMagick完全一致,直接套用上面的命令即可;
- 如果仍出现链接错误,检查是否所有依赖库都安装了对应的
:i386版本,比如Protobuf需要SSL支持的话,要装libssl-dev:i386。
内容的提问来源于stack exchange,提问作者WilliamB
相关产品推荐
相关产品推荐

