树莓派3B+ Clang交叉编译工具链搭建libstdc++及头文件缺失问题咨询
解决方案
方案1:使用系统预装Clang快速实现(无需自编译LLVM全套)
该方案无需编译整套LLVM工具链,10分钟内即可配置完成,完全符合使用需求:
- 第一步:安装宿主端依赖
sudo apt update sudo apt install clang-7 lld-7 g++-arm-linux-gnueabihf gcc-arm-linux-gnueabihf libstdc++-8-dev-armhf-cross
- 第二步:创建Clang全局配置文件
新建/etc/clang7-armhf.cfg文件,写入以下内容:
--target=arm-linux-gnueabihf --sysroot=/ -march=armv7-a -mfpu=neon-vfpv4 -mfloat-abi=hard -I/usr/arm-linux-gnueabihf/include/c++/8/ -I/usr/arm-linux-gnueabihf/include/c++/8/arm-linux-gnueabihf/ -L/usr/arm-linux-gnueabihf/lib -L/usr/lib/gcc-cross/arm-linux-gnueabihf/8/
如果需要和树莓派系统库版本完全匹配,可将树莓派根目录打包复制到宿主端/opt/rpi-sysroot路径,将上述配置中的--sysroot=/改为--sysroot=/opt/rpi-sysroot即可。
- 第三步:配置调用别名
编辑当前用户家目录下的.bashrc(若使用zsh则编辑.zshrc),加入以下内容:
alias clang++="clang++-7 --config=/etc/clang7-armhf.cfg"
执行source ~/.bashrc(或对应shell配置文件)生效后,直接运行clang++ hello_world.cpp即可输出适配树莓派3B+的armhf二进制文件。
方案2:修正自编译Clang+libcxx的构建流程
之前编译libcxx、libcxxabi时报错的核心原因是未指定交叉编译相关参数,把宿主检测逻辑和目标端编译逻辑混淆,修正步骤如下:
- 先安装基础交叉编译依赖:
sudo apt install gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf libstdc++-8-dev-armhf-cross
- 编译libcxx、libcxxabi时,在原有cmake参数基础上新增以下配置:
-DCMAKE_CROSSCOMPILING=ON -DLLVM_TARGET_TRIPLE=arm-linux-gnueabihf -DLIBCXX_TARGET_TRIPLE=arm-linux-gnueabihf -DLIBCXXABI_TARGET_TRIPLE=arm-linux-gnueabihf -DLIBCXX_SYSROOT=/usr/arm-linux-gnueabihf/ -DLIBCXXABI_SYSROOT=/usr/arm-linux-gnueabihf/ -DCMAKE_C_FLAGS="-march=armv7-a -mfpu=neon-vfpv4 -mfloat-abi=hard" -DCMAKE_CXX_FLAGS="-march=armv7-a -mfpu=neon-vfpv4 -mfloat-abi=hard"
- 编译安装完成后,参照方案1的步骤给自编译的clang添加配置文件与别名,即可实现默认编译armhf二进制的需求。
结果验证
编译完成后执行file a.out,输出结果需包含ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV)字样,将生成的二进制文件复制到树莓派3B+即可直接运行。
内容的提问来源于stack exchange,提问作者Mikkel Larsen
相关产品推荐
相关产品推荐

