将x86 GNU科学库交叉编译至ARM架构遇格式错误求助
我之前给ARM平台交叉编译库时也碰到过一模一样的问题,这个错误本质上是生成的libgsl.so还是x86架构的,或者目标系统没法正确识别它的格式。咱们一步步来排查解决:
第一步:确认交叉编译工具链是否正常工作
你指定了--host=arm-linux-gnueabi,首先得确保系统里已经安装了对应的ARM交叉编译工具链。在Ubuntu这类系统上,你可以先安装工具链:sudo apt install gcc-arm-linux-gnueabi g++-arm-linux-gnueabi安装完成后,验证工具是否能正常调用:
arm-linux-gnueabi-gcc --version如果输出工具链的版本信息,说明工具链没问题;要是提示"command not found",那得先解决工具链的安装或环境变量配置问题。
第二步:强制指定交叉编译器重新配置
有时候configure会因为找不到ARM编译器,自动 fallback 到本地的x86编译器,导致生成的库还是x86架构的。这时候你需要手动指定CC和CXX环境变量,确保configure用对编译器:cd gsl-2.4 make clean && make distclean CC=arm-linux-gnueabi-gcc CXX=arm-linux-gnueabi-g++ ./configure --build=x86_64-pc-linux-gnu --host=arm-linux-gnueabi --prefix=/usr/local/arm-linux注意先执行
make clean和make distclean清除之前的配置和编译文件,避免残留影响。第三步:验证生成的库架构是否正确
编译完成后,不要急着拷贝到目标板,先在本地用交叉工具链的readelf验证库的架构:arm-linux-gnueabi-readelf -h ./libgsl.so看输出里的
Machine字段,如果显示ARM,说明库是正确的ARM架构;要是显示Advanced Micro Devices X86-64,那说明编译还是用了x86编译器,得回到第二步检查配置命令。第四步:检查目标板的运行环境(或改用静态编译)
如果库本身是ARM架构的,但目标板还是报错,可能是目标板上的动态链接器不匹配。这时候可以考虑编译静态版本的GSL,避免动态链接的问题:
在configure的时候加上--enable-static --disable-shared参数:CC=arm-linux-gnueabi-gcc CXX=arm-linux-gnueabi-g++ ./configure --build=x86_64-pc-linux-gnu --host=arm-linux-gnueabi --prefix=/usr/local/arm-linux --enable-static --disable-shared这样生成的是静态库
libgsl.a,编译你的应用时链接这个静态库,就不用依赖目标板上的动态链接器了。
另外,还要留意make过程中的输出,确保每一步编译都是用arm-linux-gnueabi-gcc而不是本地的gcc,如果发现用了本地编译器,那肯定是配置环节出了问题,得重新检查参数。
内容的提问来源于stack exchange,提问作者Joel M

