![如何检查我的ARM64板是否支持32位二进制编译? (错误:无法识别的命令行选项“-m32”)](https://linux22.com/image/13219/%E5%A6%82%E4%BD%95%E6%A3%80%E6%9F%A5%E6%88%91%E7%9A%84ARM64%E6%9D%BF%E6%98%AF%E5%90%A6%E6%94%AF%E6%8C%8132%E4%BD%8D%E4%BA%8C%E8%BF%9B%E5%88%B6%E7%BC%96%E8%AF%91%EF%BC%9F%20%EF%BC%88%E9%94%99%E8%AF%AF%EF%BC%9A%E6%97%A0%E6%B3%95%E8%AF%86%E5%88%AB%E7%9A%84%E5%91%BD%E4%BB%A4%E8%A1%8C%E9%80%89%E9%A1%B9%E2%80%9C-m32%E2%80%9D%EF%BC%89.png)
我在AWS上有一个ARM虚拟机,安装了Ubuntu18.04。
dpkg 和 uname 命令显示了这一点,
$ dpkg --print-architecture
arm64
$ uname -m
aarch64
我有一个为 32 位构建的第三方预编译静态库 (.a)。
我知道我无法将 32 位库链接到 64 位应用程序,因此我创建了一个新应用程序,它将链接该库并编译为 32 位。该应用程序将使用某种 IPC 机制与其余应用程序(64 位)进行通信。为了编译这个应用程序,我在我的 cmake 文件中添加了以下标志,
set (CMAKE_CXX_FLAGS "-m32")
但编译器抛出这个错误,
c++: error: unrecognized command line option ‘-m32’
我的机器上的 c++ 版本是,
$ c++ -v
Using built-in specs.
COLLECT_GCC=c++
COLLECT_LTO_WRAPPER=/usr/lib/gcc/aarch64-linux-gnu/7/lto-wrapper
Target: aarch64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu/Linaro 7.4.0-1ubuntu1~18.04.1' --with-bugurl=file:///usr/share/doc/gcc-7/README.Bugs --enable-languages=c,ada,c++,go,d,fortran,objc,obj-c++ --prefix=/usr --with-gcc-major-version-only --program-suffix=-7 --program-prefix=aarch64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-libquadmath --disable-libquadmath-support --enable-plugin --enable-default-pie --with-system-zlib --enable-multiarch --enable-fix-cortex-a53-843419 --disable-werror --enable-checking=release --build=aarch64-linux-gnu --host=aarch64-linux-gnu --target=aarch64-linux-gnu
Thread model: posix
gcc version 7.4.0 (Ubuntu/Linaro 7.4.0-1ubuntu1~18.04.1)
它表明它已准备好配置选项--启用多架构我想这应该允许我针对不同的体系结构(32 位 ARM)进行编译。
stackoverflow 上的另一个线程表示某些 ARM64 机器的硬件可能不支持 32 位应用程序的编译。
我的问题是如何检查我的 ARM64 机器是否能够构建 32 位应用程序?如果它能够建造那么有什么替代方案-m32旗帜?
答案1
我通过使用不同的工具链编译 32 位和 64 位应用程序解决了这个问题 - 分别是arm-linux-gnueabihf 和arm-linux-gnueabi。不确定是否存在更好的方法。
不管怎样,我不再需要这个了,因为我使用的 ARM64 机器的 Cavium 处理器不支持 32 位库。我必须找到一种方法来获取 64 位版本的库。