ARM64架构下IPOPT交叉编译报错及兼容性问询
问题描述
不清楚IPOPT是否支持ARM64架构的交叉编译,在Ubuntu18.04环境下使用aarch64-linux-gnu编译器尝试交叉编译IPOPT时出现错误。目前已成功交叉编译blas、lapack、coinhsl、coinasl和mumps库(file命令显示为aarch64架构),编译IPOPT时的错误信息如下:
make[2]: 进入目录“/home/gzy/casadicompile/Ipopt-releases-3.13.0/build/src/Apps/AmplSolver” CXX ampl_ipopt.o CXX AmplTNLP.lo CXXLD libipoptamplinterface.la libtool: warning: '/home/gzy/casadicompile/arm64compiler/aarch64-linux-gnu-master/bin/../lib/gcc/aarch64-linux-gnu/13.0.0/../../../../aarch64-linux-gnu/lib/../lib64/libstdc++.la' seems to be moved libtool: warning: library '/home/gzy/casadicompile/arm64compiler/aarch64-linux-gnu-master/bin/../lib/gcc/aarch64-linux-gnu/13.0.0/../../../../aarch64-linux-gnu/lib/../lib64/libstdc++.la' was moved. CXXLD ipopt libtool: warning: library '/home/gzy/casadicompile/arm64compiler/aarch64-linux-gnu-master/bin/../lib/gcc/aarch64-linux-gnu/13.0.0/../../../../aarch64-linux-gnu/lib/../lib64/libstdc++.la' was moved. libtool: warning: library '/home/gzy/casadicompile/arm64compiler/aarch64-linux-gnu-master/bin/../lib/gcc/aarch64-linux-gnu/13.0.0/../../../../aarch64-linux-gnu/lib/../lib64/libstdc++.la' was moved. /home/gzy/casadicompile/arm64compiler/aarch64-linux-gnu-master/bin/../lib/gcc/aarch64-linux-gnu/13.0.0/../../../../aarch64-linux-gnu/bin/ld: /home/gzy/casadicompile/arm64compiler/aarch64-linux-gnu-master/bin/../lib/gcc/aarch64-linux-gnu/13.0.0/../../../../aarch64-linux-gnu/lib/../lib64/libstdc++.so: undefined reference to `fstat64@GLIBC_2.33' /home/gzy/casadicompile/arm64compiler/aarch64-linux-gnu-master/bin/../lib/gcc/aarch64-linux-gnu/13.0.0/../../../../aarch64-linux-gnu/bin/ld: /home/gzy/casadicompile/arm64compiler/aarch64-linux-gnu-master/bin/../lib/gcc/aarch64-linux-gnu/13.0.0/../../../../aarch64-linux-gnu/lib/../lib64/libstdc++.so: undefined reference to `pthread_key_create@GLIBC_2.34'
解决方案及支持确认
1. IPOPT对ARM64架构的支持情况
IPOPT完全支持ARM64(aarch64)架构的交叉编译,社区存在大量成功实践案例,官方文档未限制该架构的编译。当前错误并非IPOPT本身的架构兼容性问题,而是工具链与系统GLIBC版本不匹配导致的链接错误。
2. 链接错误的具体解决步骤
错误根源:使用的aarch64-linux-gnu GCC 13.0.0依赖的GLIBC版本(2.33/2.34)远高于Ubuntu 18.04默认的GLIBC 2.27,导致链接时无法找到高版本GLIBC符号。
更换匹配系统的交叉编译工具链
弃用高版本自定义工具链,改用Ubuntu 18.04仓库提供的适配版本:sudo apt update sudo apt install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu该工具链的GCC版本为7.x,依赖的GLIBC版本与Ubuntu 18.04完全匹配,可避免符号缺失问题。
重新配置并编译IPOPT
清理原有build目录,重新运行configure指定新工具链及ARM64依赖库:rm -rf build && mkdir build && cd build ../configure --host=aarch64-linux-gnu \ --with-blas=/path/to/your/arm64/blas \ --with-lapack=/path/to/your/arm64/lapack \ --with-hsl=/path/to/your/arm64/coinhsl \ --with-mumps=/path/to/your/arm64/mumps make -j$(nproc)注意将上述路径替换为你实际编译好的ARM64依赖库路径。
消除libstdc++.la移动警告(可选)
该警告由工具链路径变动导致libtool无法定位.la文件,不影响编译结果。若要消除,可在configure时添加--disable-libtool-lock参数,或重新生成工具链的libstdc++.la文件。
内容的提问来源于stack exchange,提问作者郭中一

