WSL Ubuntu:如何设置 gcc 以便为具有特定 glibc 版本的 arm 进行交叉编译?

WSL Ubuntu:如何设置 gcc 以便为具有特定 glibc 版本的 arm 进行交叉编译?

我并不是真正的 Linux 专家,所以我感觉有点迷茫。

我在 WSL 中运行 Ubuntu 22.04.3 LTS 映像,因为我需要使用 Windows PC 交叉编译 ARM Linux PC(BeagleBone Black,从现在起为“BBB”)的程序。该映像由 Powershell 命令自动安装,WSL.exe --install我对此很满意。

我已经能够添加 armhf 架构、gcc-arm-linux-gnueabihf 并构建我的程序,但是我收到了来自 BBB 的 glibc 版本错误。

所以我尝试安装 BBB 上的 GCC 版本,即 10,但没有成功。尝试了 9,结果相同。


这就是我在 WSL UBUNTU 上安装所有内容的方式(省略所有更新/升级):

    sudo bash -c "echo 'deb [arch=armhf] http://ports.ubuntu.com/ubuntu-ports       jammy main restricted universe multiverse'            >  /etc/apt/sources.list.d/armhf.list"
    sudo bash -c "echo 'deb [arch=armhf] http://ports.ubuntu.com/ubuntu-ports       jammy-updates main restricted universe multiverse'    >> /etc/apt/sources.list.d/armhf.list"
    sudo bash -c "echo 'deb [arch=armhf] http://ports.ubuntu.com/ubuntu-ports       jammy-security main restricted universe multiverse'   >> /etc/apt/sources.list.d/armhf.list"
    sudo bash -c "echo 'deb [arch=armhf] http://ports.ubuntu.com/ubuntu-ports       jammy-backports main restricted universe multiverse'  >> /etc/apt/sources.list.d/armhf.list"
    sudo dpkg --add-architecture armhf
    sudo apt install build-essential checkinstall -y
    sudo apt install  gcc-9-arm-linux-gnueabihf g++-9-arm-linux-gnueabihf -y
    sudo update-alternatives --install \
                          /usr/bin/arm-linux-gnueabihf-gcc          arm-gcc          /usr/bin/arm-linux-gnueabihf-gcc-9 \
                100 \
                --slave   /usr/bin/arm-linux-gnueabihf-cc           arm-cc           /usr/bin/arm-linux-gnueabihf-gcc-9 \
                --slave   /usr/bin/arm-linux-gnueabihf-c++          arm-c++          /usr/bin/arm-linux-gnueabihf-g++-9 \
                --slave   /usr/bin/arm-linux-gnueabihf-cpp          arm-cpp          /usr/bin/arm-linux-gnueabihf-cpp-9 \
                --slave   /usr/bin/arm-linux-gnueabihf-g++          arm-g++          /usr/bin/arm-linux-gnueabihf-g++-9 \
                --slave   /usr/bin/arm-linux-gnueabihf-gcov         arm-gcov         /usr/bin/arm-linux-gnueabihf-gcov-9 \
                --slave   /usr/bin/arm-linux-gnueabihf-gcov-dump    arm-gcov-dump    /usr/bin/arm-linux-gnueabihf-gcov-dump-9 \
                --slave   /usr/bin/arm-linux-gnueabihf-gcov-tool    arm-gcov-tool    /usr/bin/arm-linux-gnueabihf-gcov-tool-9 \
                --slave   /usr/bin/arm-linux-gnueabihf-lto-dump     arm-lto-dump     /usr/bin/arm-linux-gnueabihf-lto-dump-9 \
                --slave   /usr/bin/arm-linux-gnueabihf-gcc-ar       arm-gcc-ar       /usr/bin/arm-linux-gnueabihf-gcc-ar-9 \
                --slave   /usr/bin/arm-linux-gnueabihf-gcc-nm       arm-gcc-nm       /usr/bin/arm-linux-gnueabihf-gcc-nm-9 \
                --slave   /usr/bin/arm-linux-gnueabihf-gcc-ranlib   arm-gcc-ranlib   /usr/bin/arm-linux-gnueabihf-gcc-ranlib-9
    sudo apt install libgtk-3-dev:armhf -y

现在,我不再构建项目,因为这会花费太多时间,而是在接受的答案中构建了示例代码这个问题在 UBUNTU 和 BBB 上都是如此。

建立在 BBB 上的输出为:

GNU libc version: 2.31

在 PC 上构建的一个总是输出此错误:

./glibc-version-ARM: /lib/arm-linux-gnueabihf/libc.so.6: version `GLIBC_2.34' not found (required by ./glibc-version-ARM)

因此,我显然遗漏了一些与 GCC 版本无关的内容。有人能帮我完成交叉编译吗?

答案1

完全最新的 Ubuntu 22.04 安装应该已经安装了 glibc 2.35[1],而你的 BeagleBone 有 glibc 2.31。glibc 不向前兼容,这意味着您为 glibc 2.35 构建的程序不能保证在早期版本的 glibc 上运行。

解决方案是,如果可能的话,将主板上的软件更新为较新的版本(带有 glibc 2.35+ 的版本),或者使用旧版本的 glibc 进行编译——在我看来,最简单的方法是安装Ubuntu 20.04,它使用 glibc 2.31。

libgcc 应该是向前兼容的,所以 GCC 版本无关紧要。

相关内容