针对 Raspberry pi 3B+ 的 Clang 交叉编译

Mik*_*sen 5 c++ linux cmake clang raspberry-pi

我一直在尝试建立一个 clang 交叉编译器工具链,将 C/C++ 主机 x86-64-linux-gnu 编译为目标 arm-linux-gnueabihf。输出二进制文件旨在在具有armv7 cortex-53a CPU的树莓派3B+上运行。raspberry pi 操作系统相当于 Raspian 的 debian-buster,因此 apt 中的默认 clang 是 clang-7.0.1。

我希望能够完成一个 clang 交叉编译器,可以用

clang++ hello_world.cpp
Run Code Online (Sandbox Code Playgroud)

默认情况下,使用正确的 arm-linux-gnueabihf 包含和库路径进行编译和链接。对我而言,使用的链接器并不重要。

我首先按照https://solarianprogrammer.com/2019/05/04/clang-cross-compiler-for-raspberry-pi/和 TLDR 上的指南进行操作;它下载具有适当版本 (7.0.1) 的 llvm-project,使用 cmake 标志,使用 cmake 和 ninja 构建 LLVM、clang、compiler-rt、lld、libunwind 和 polly:

-DCMAKE_BUILD_TYPE=Release
-DLLVM_BUILD_DOCS=OFF -DCMAKE_INSTALL_PREFIX=/usr/local/cross_armhf_clang_7
-DCMAKE_CROSSCOMPILING=True -DLLVM_DEFAULT_TARGET_TRIPLE=arm-linux-gnueabihf 
-DLLVM_TARGET_ARCH=ARM 
-DLLVM_TARGETS_TO_BUILD=ARM
Run Code Online (Sandbox Code Playgroud)

但是当尝试使用新构建的 clang 编译 libcxxabi 和 libcxx 时,它找不到正确的 libstdc++:

 CMake Error at /usr/local/cross_armhf_clang_7/lib/cmake/llvm/CheckCompilerVersion.cmake:38 (message):
   Host Clang must be able to find libstdc++4.8 or newer!
Call Stack (most recent call first):
  /usr/local/cross_armhf_clang_7/lib/cmake/llvm/HandleLLVMOptions.cmake:9 (include)
  cmake/Modules/HandleOutOfTreeLLVM.cmake:97 (include)
  cmake/Modules/HandleOutOfTreeLLVM.cmake:140 (configure_out_of_tree_llvm)
  CMakeLists.txt:29 (include)
Run Code Online (Sandbox Code Playgroud)

在这里我使用 cmake 标志:

-DCMAKE_BUILD_TYPE=Release 
-DCMAKE_INSTALL_PREFIX=/usr/local/cross_armhf_clang_7 
-DLLVM_TARGETS_TO_BUILD=ARM 
-DCMAKE_C_COMPILER=/usr/local/cross_armhf_clang_7/bin/clang 
-DCMAKE_CXX_COMPILER=/usr/local/cross_armhf_clang_7/bin/clang++
Run Code Online (Sandbox Code Playgroud)

我还尝试在我的桌面上使用 clang-10 编译一个简单的 hello-world.cpp ,并在我的 sysroot 中安装了 arm-linux-gnueabihf binutils、gcc 等

clang++ --target=arm-linux-gnueabihf hello-world.cpp
Run Code Online (Sandbox Code Playgroud)

这给了我

/usr/bin/../lib/gcc-cross/arm-linux-gnueabihf/9/../../../../include/c++/9/string:38:10: fatal error: 'bits/c++config.h' file not found
Run Code Online (Sandbox Code Playgroud)

我还尝试使用 llvm 网页上的指南与 clang 进行交叉编译并构建 libc++,但没有成功。

关于我能做什么来解决这个问题有什么建议吗?