我正在尝试为我的Ubuntu机器上的Raspberry Pi进行交叉编译 .
在我最初的尝试中,我使用的是arm-linux-gnueabi编译器,它可以在Ubuntu repo中找到 . 我有这个工作 . 我能够构建所有依赖项并在我的cmake项目中使用交叉编译器 .
但是,我相信我应该使用hf版本,所以我切换到arm-linux-gnueabihf . 然后我意识到这不适用于Raspberry Pi,因为它是armv6 .
经过一些谷歌搜索后,我找到了pre-built toolchain from GitHub .
我下载了工具链,但我真的不明白如何“安装”它 . 我将文件解压缩到我的主目录 . 目录结构如下所示:
/gcc-linearo-arm-linux-gnueabihf-raspbian
/arm-linux-gnueabihf
/bin
(contains g++, gcc, etc)
/lib
(contains libstdc++ library)
/bin
(contains arm-linux-gnueabihf-g++, arm-linux-gnueabihf-...)
/lib
(gcc lib stuff)
如果我将目录更改为INNER bin文件夹,我可以从终端编译测试程序,没有任何问题 .
~/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/
arm-linux-gnueabihf/bin$ g++ test.cpp -o test
然后我尝试在OUTER bin文件夹中编译测试程序,该文件夹包含工具的前缀版本 .
~/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin$
arm-linux-gnueabihf-g++ test.cpp -o test
但是,当我尝试使用编译器时(从内部bin目录之外),它无法找到工具链附带的libstdc共享库:
arm-linux-gnueabihf-gcc: error while loading shared libraries:
libstdc++.so.6: cannot open shared object file: No such file or directory.
此外,我希望能够使用编译器而无需导航到bin目录 . 所以我尝试添加OUTER bin目录(因为我想要前缀版本)和两个lib目录到我的PATH:
export PATH=$PATH:~/tools/.../bin
export PATH=$PATH:~/tools/.../lib
export PATH=$PATH:~/tools/.../.../lib
但是,这会导致相同的错误 . 我应该如何“安装”工具链,以便我可以在任何地方使用工具链,就像我在使用Ubuntu repo中的交叉编译器时一样?
8 回答
我无法使用git://github.com/raspberrypi/tools.git中的任何(相当过时的)工具链编译QT5 . 配置脚本因“无法确定体系结构”错误以及包含目录的大量路径问题而失败 . 对我有用的是使用Linaro工具链
与...结合
无法修复sysroot的符号链接会导致未定义的符号错误,如下所述:An error building Qt libraries for the raspberry pi当我尝试使用tools.git中的fixQualifiedLibraryPaths脚本时,这种情况发生了 . Everthing else在http://wiki.qt.io/RaspberryPi2EGLFS中有详细描述 . 我的配置设置是:
/ usr / local / rasp / sysroot是我本地Raspberry Pi 3 Raspbian(Jessie)系统副本的路径,而/ usr / local / qt5pi是交叉编译QT的路径,也必须复制到设备 . 请注意,当您选择工具链时,Jessie会附带GCC 4.9.2 .
您也可以使用clang . 它曾经比GCC更快,现在它是一个非常稳定的东西 . 从源头构建clang要容易得多(在构建过程中你真的可以喝杯咖啡) .
简而言之:
获取clang二进制文件(sudo apt-get install clang)..或下载并构建(read instructions here)
挂载您的raspberry rootfs(它可能是通过sshfs或图像挂载的真正rootfs) .
编译代码:
您可以选择使用旧版arm-linux-gnueabihf binutils . 然后你可以删除末尾的“-fuse-ld = lld”标志 .
下面是我的cmake工具链文件 .
toolchain.cmake
最初的问题已在很久以前发布,与此同时,Debian在多源支持方面取得了巨大进展 .
Multiarch是交叉编译的一项伟大成就!
简而言之,需要以下步骤来利用multiarch进行Raspbian Jessie交叉编译:
在您的Ubuntu主机上安装Debian Jessie amd64在chroot或LXC容器中 .
启用外部架构armhf .
从emdebian工具库安装交叉编译器 .
通过编写自定义gcc规范文件来调整交叉编译器(默认情况下会为ARMv7-A生成代码) .
从Raspbian存储库安装armhf库(libstdc等) .
构建源代码 .
由于这是很多工作,我自动完成了上述设置 . 你可以在这里读到它:
Cross Compiling for Raspbian
我创建了最新的预编译Raspberry Pi GCC交叉编译器/本地二进制文件集(最简单的方法):
Raspberry Pi GCC交叉编译器/本地二进制文件(v8.2.0)
我无法让编译器(
x64
版本)使用sysroot
,直到我将SET(CMAKE_SYSROOT $ENV{HOME}/raspberrypi/rootfs)
添加到pi.cmake
.我会尝试将此作为教程编写,因此很容易理解 .
预先要求
在开始之前,您需要确保安装以下内容:
让我们交叉编译一个馅饼!
首先在主目录中创建一个名为
raspberrypi
的文件夹 .转到此文件夹并下拉上面提到的整个工具文件夹:
如果我没有读错,你想使用3个中的以下内容,
gcc-linaro-arm-linux-gnueabihf-raspbian
.进入您的主目录并添加:
到名为
~/.bashrc
的文件的末尾现在您可以注销并重新登录(即重新启动终端会话),或者在终端中运行
. ~/.bashrc
以在当前终端会话中选择PATH
添加 .现在,验证您是否可以访问编译器
arm-linux-gnueabihf-gcc -v
. 你应该得到这样的东西:但是嘿!我做到了,libs仍然无法正常工作!
我们还没有完成!到目前为止,我们只完成了基础知识 .
在
raspberrypi
文件夹中,创建一个名为rootfs
的文件夹 .现在,您需要将整个
/lib
和/usr
目录复制到此新创建的文件夹中 . 我通常带上rpi图像并通过rsync复制它:其中
192.168.1.PI
被您的Raspberry Pi的IP替换 .现在,我们需要编写一个
cmake
配置文件 . 在您喜欢的编辑器中打开~/home/raspberrypi/pi.cmake
并插入以下内容:现在,您应该只需添加此额外标志即可编译
cmake
程序:-D CMAKE_TOOLCHAIN_FILE=$HOME/raspberrypi/pi.cmake
.使用cmake hello world示例:
有一个CDP Studio IDE可以从windows和linux进行交叉编译和部署非常简单,你可以在安装过程中检查raspberry工具链复选框 . (PS . 它有GPIO和I2C支持,所以不需要代码来访问它们)
树莓使用的IDE演示在这里:https://youtu.be/4SVZ68sQz5U
你可以在这里下载IDE:https://cdpstudio.com/home-edition
对于Windows主机,我强烈推荐this tutorial::
下载并安装工具链
将sysroot与RPi include / lib目录同步
编译代码
使用SmarTTY将可执行文件拖放到RPi
跑吧!
没有更多,没有更少!
预构建的GNU工具链可用于Raspberry,Beaglebone,Cubieboard,AVR(Atmel)等