树莓派编译法
Golang也就是Go语言,现在已经发行到1.4.1版本了,语言特性优越性和背后Google强大靠山什么的就不多说了。Golang的官方提供了多个平台上的二进制安装包,遗憾的是并非没有发布ARM平台的二进制安装包。ARM平台没办法直接从官网下载二进制安装包来安装,好在Golang是支持多平台并且开源的语言,因此可以通过直接在ARM平台上编译源代码来安装。整个过程主要包括编译工具配置、获取Golang源代码、设置Golang编译环境变量、编译、配置Golang行环境变量等步骤。
注:本文选用树莓派做测试,因为树莓派是基于ARM平台的。
1、编译工具配置
据说下个版本的golang编译工具要使用golang自己来写,但目前还是使用C编译工具的。因此,首先要配置好C编译工具:
1.1在Ubuntu或Debian平台上可以使用sudoapt-getinstallgcclibc6-dev命令安装,树莓派的RaspBian系统是基于Debian修改的,所以可以使用这种方法安装。
1.2在RedHat或CentOS6平台上可以使用sudoyuminstallgcclibc-devel命令安装。
安装完成后可以输入gcc--version命令验证是否成功安装。
2、获取golang源代码
2.1直接从官网下载源代码压缩包。
golang官网提供golang的源代码压缩包,可以直接下载,最新的1.4.1版本源代码链接:/golang/go1.4.1.src.tar.gz
2.2使用git工具获取。
golang使用git版本管理工具,也可以使用git获取golang源代码。推荐使用这个方法,因为以后可以随时获取最新的golang源代码。
2.2.1首先确认ARM平台上已经安装了git工具,可以使用git--version命令确认。一般linux平台都安装了git,没有的话可以自行安装,不同平台的安装方法可以参考:download/linux
2.2.2克隆远程golang的git仓库到本地
在终端cd到你想要安装golang的目录,确保该目录下没有名为go的目录。然后以下命令获取代码仓库:
gitclone/go
大陆地区可能会获取失败,在不翻墙的情况下我试了几次都没成功,原因大家都懂的。好在google已经将golang也托管到github上面,所以也可以通过下面命令获取:
gitclone/golang/go.git
视网络情况,下载可能需要不少时间。我2M的带宽花了将近两个小时才下载完,虽然整个项目不过几十兆==
下载完成后,可以看到目录下多了一个go目录,里面即为golang的源代码,在终端上执行cdgo命令进入该目录。
执行下面命令检出go1.4.1版本的源代码,因为现在汪敏指已经有新的代码提交上去了,最新的代码可能不是最稳定的:
gitcheckoutgo1.4.1
至此,最新1.4.1发行版的源代码获取完毕
3、设置golang的编译环境变量
主要有GOROOT、GOOS、GOARCH、GOARM四个环境变量需要设置,先解释四个环境变量的意义。
3.1GOROOT
主要代表golang树结构目录的路径,也就是上面git检出的go目录。一般可以不用设置这个环境变量,因为编译的时候默认会以go目录下src子目录中的all.bash脚本困配运行时的父目录作为GOROOT的值。为了保险起见,可以直接设拿芹置为go目录的路径。
3.2GOOS和GOARCH
分别代表编译的目标系统和平台,可选值如下:
GOOSGOARCH
darwin386
darwinamd64
dragonfly386
dragonflyamd64
freebsd386
freebsdamd64
freebsdarm
linux386
linuxamd64
linuxarm
netbsd386
netbsdamd64
netbsdarm
openbsd386
openbsdamd64
plan9386
plan9amd64
solarisamd64
windows386
windowsamd64
需要注意的是这两个值代表的是目标系统和平台,而不是编译源代码的系统和平台。树莓派的RaspBian是linux系统,所以这些GOOS设置为linux,GOARCH设置为arm。
3.3GOARM
表示使用的浮点运算协处理器版本号,只对arm平台有用,可选值有5,6,7。如果是在目标平台上编译源代码,这个值可以不设置,它会自动判断需要使用哪一个版本。
总结下来,在树莓派上设置golang的编译环境变量,可编辑$HOME/.bashrc文件,在末尾添加下面内容:
exportGOROOT=你的go目录路径
exportGOOS=linux
exportGOARCH=arm
编辑完后保存,执行source~/.bashrc命令让修改生效。
4、编译源代码
环境变量配置完成自后就可以开始编译源代码。在go目录下的src子目录中,主要有all.bash和make.bash两个脚本(另外还有两个all.bat和make.bat脚本适用于window平台)。编译实际上就是执行其中一个脚本,两者的区别在于all.bash在编译完成后还会执行一些测试套件。如果希望只编译不测试,可以运行make.bash脚本。使用cd命令进入go下src目录,执行./all.bash或者./make.bash命令即可开始编译。由于硬件情况不同,编译耗费的时间不同。在我的B型树莓派编译过程花费了将近半个小时,编译完成后执行的测试套件又花费了差不多一个小时,总共花费了一个半小时左右。
5、配置golang运行环境变量
编译完成后,go目录下会生成bin目录,里面就是go的运行脚本。为了以后使用方法,可以将这个bin路径添加到PATH环境变量中。同样编辑~/.bashrc文件,因为前面设置过GOROOT环境变量指向go目录了,所以只需要在末尾加上
exportPATH=$PATH:$GOROOT/bin
保存后同样执行source~/.bashrc命令让环境变量生效。
至此,golang源代码编译安装成功。执行goversion应该就能看到当前golang的版本信息,表示编译安装成功。
‘贰’ 嵌入式开发板上C编译器比较
在嵌入式系统开发中,C编译器的选择对项目成功至关重要。本文将针对树莓派等开发板上常见的GCC和Clang编译器进行深入比较,包括安装方法、性能对比以及适用场景,以帮助开发者做出明智决策。
首先,GCC,GNU Compiler Collection,作为开源的跨平台编译器,广泛应用于Linux设备,如树莓派。其安装在Debian基础的Linux系统上相当简便,只需在终端输入命令进行安装。GCC的优点包括广泛的语言支持和高度优化,但缺点可能包括编译速度和错误信息的清晰度。
相比之下,Clang,LLVM的前端,作为GCC的后起之秀,目标是改进编译器性能。在树莓派上安装Clang同样容易,它在编译速度和用户反馈(错误报告)上有优势。然而,Clang可能在某些复杂优化上不如GCC。
在性能对比上,两者各有千秋,具体选择取决于项目需求。例如,对性能要求极高的项目可能更倾向于GCC,而对快速开发和易于理解错误信息的项目可能更倾向于Clang。因此,建议在项目初期尝试使用两者,以便找到最适合的工具。
‘叁’ 如何在windows下或者linux下对树莓派编程(C语言或C++)
硬件的没玩过
树莓派 是不是那个 教学型 ARM编程主板?
建议你去 他们官方论坛看下
我同学他们毕业搞ARM的 都是 自己焊接板子的
然后用 winCE或者 unix linux 的嵌入式系统
他这种定制的包装过的,一般都把很多底层的 原理封装了,只需要 学号他官方提供的 支持文档和事例程序,就能实现 很多功能。而且
如果 你直接去学C/C++ windows编程 以及通信编程 SSH协议 等 反倒离目的远了。
我估计你应该是个 爱好者,或者学生。
论坛里有很多 爱好者 发的 相关项目及 细节
比如:我刚才在 论坛里看到一个帖子说
做了一个工具,在windows下面和pi 进行ssh 交互
http://bbs.ickey.cn/index.php?app=group&ac=topic&id=2573
‘肆’ 树莓派3b支持DirectX 9.0吗想用wine跑点游戏
Stage 1:寻找消失的指令集
对比加载新内核前后树莓派3B上执行lscpu的输出:
Before:Architecture: armv7l
...Flags: half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm crc32After:Architecture: aarch64
...Flags: fp asimd evtstrm crc32
显然,有许多指令集莫名消失。
笔者使用的aarch-linux-gnu-工具链:
$ aarch64-linux-gnu-gcc -v
Using built-in specs.
COLLECT_GCC=aarch64-linux-gnu-gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc-cross/aarch64-linux-gnu/6/lto-wrapperTarget: aarch64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Debian 6.3.0-18' --with-bugurl=file:///usr/share/doc/gcc-6/README.Bugs --enable-languages=c,ada,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-6 --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 --enable-plugin --enable-default-pie --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-6-arm64-cross/jre --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-6-arm64-cross --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-6-arm64-cross --with-arch-directory=aarch64 --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --disable-libgcj --enable-multiarch --enable-fix-cortex-a53-843419 --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=aarch64-linux-gnu --program-prefix=aarch64-linux-gnu- --includedir=/usr/aarch64-linux-gnu/includeThread model: posix
gcc version 6.3.0 20170516 (Debian 6.3.0-18)
笔者遂使用crosstool-ng制作编译工具链,并惊喜地发现:
$ ls /opt/crosstool-ng/samples/aarch64-rpi3-linux-gnueabi
...
crosstool-ng-1.23.0-75-ga9f8a8e6中已添加针对树莓派3的支持。
于是笔者开始制作工具链。
选中了linaro分支的gcc。
并按照与前文相似的方法编译内核,然而没有效果,指令集仍未被识别。
后来笔者查阅资料后发现,aarch64是一套全新的指令集,asimd代替了neon。
Stage 2:使用debootstrap制作64位组件
尽管内核工作于64位模式,但系统大多数组件仍旧处于32位模式下。
我们的目标是引入Debian 9 arm64,自然会想到使用debootstrap。
在树莓派上,给一张SD卡分两个区:
一个在前面,大小100M左右,使用mkfs.vfat,类型为W95 FAT32
一个占用后面所有的空间,视/boot/cmdline.txt中rootfstype的设置选择分区格式
- deb http://mirrors.ustc.e.cn/debian/ stretch maindeb http://mirrors.ustc.e.cn/archive.raspberrypi.org/ jessie main non-free contrib
- sudo mount -t proc proc procsudo mount -t sysfs sysfs syssudo mount -o bind /dev devsudo chroot .
- apt install hostapd wpasupplicant udhcpd screen dnsmasq sudo openssh-server firmware-brcm80211 ...
firmware-brcm80211:使系统识别树莓派3板载网卡
hostapd,udhcpd,dnsmasq:启动AP必备
wpasupplicant:用于连接Wifi热点
openssh-server:SSH服务器
sudo,screen:这两个想必大家都听说过吧……
- /boot/lib/moles/etc/passwd/etc/shadow/etc/sudoers/etc/hostapd/etc/default/etc/udhcpd.conf/etc/udev//etc/dnsmasq.conf
- etc...
- sudo mv /etc/ld.so.preload /etc/ld.so.preload.bak
- sudo touch /etc/ld.so.preload
- Ign:1 https://mirrors.ustc.e.cn/debian stretch InRelease
- Get:2 https://mirrors.ustc.e.cn/archive.raspberrypi.org jessie InRelease [22.9 kB]
- Hit:2 https://mirrors.ustc.e.cn/archive.raspberrypi.org jessie InRelease
- Get:3 https://mirrors.ustc.e.cn/debian stretch Release [113 kB]
- Hit:3 https://mirrors.ustc.e.cn/debian stretch ReleaseCan't locate Storable.pm in @INC (you may need to install the Storable mole) (@INC contains: /etc/perl /usr/local/lib/aarch64-linux-gnu/perl/5.24.1 /usr/local/share/perl/5.24.1 /usr/lib/aarch64-linux-gnu/perl5/5.24 /usr/share/perl5 /usr/lib/aarch64-linux-gnu/perl/5.24 /usr/share/perl/5.24 /usr/local/lib/site_perl /usr/lib/aarch64-linux-gnu/perl-base) at /usr/bin/apt-show-versions line 37.
- BEGIN failed--compilation aborted at /usr/bin/apt-show-versions line 37.
- Reading package lists... Done
- N: Skipping acquire of configured file 'main/binary-arm64/Packages' as repository 'https://mirrors.ustc.e.cn/archive.raspberrypi.org jessie InRelease' doesn't support architecture 'arm64'N: Skipping acquire of configured file 'non-free/binary-arm64/Packages' as repository 'https://mirrors.ustc.e.cn/archive.raspberrypi.org jessie InRelease' doesn't support architecture 'arm64'
- N: Skipping acquire of configured file 'contrib/binary-arm64/Packages' as repository 'https://mirrors.ustc.e.cn/archive.raspberrypi.org jessie InRelease' doesn't support architecture 'arm64'N: Skipping acquire of configured file 'ui/binary-arm64/Packages' as repository 'https://mirrors.ustc.e.cn/archive.raspberrypi.org jessie InRelease' doesn't support architecture 'arm64'
- E: Problem executing scripts APT::Update::Post-Invoke-Success 'test -x /usr/bin/apt-show-versions || exit 0 ; apt-show-versions -i'
- E: Sub-process returned an error code
然后开干:
sudo debootstrap --verbose --arch=arm64 stretch . https://mirrors.ustc.e.cn/debian/
编辑sources.list:
apt.conf:
APT::Default-Release "stretch";
Chroot和之前的准备工作:
视具体情况安装软件包。
退出Chroot环境,复制配置文件及其它核心组件,例如:
注:笔者实际上把整个(除了/etc)64位根文件系统覆盖到了树莓派启动的SD卡上。
成功启动。
但是有烦人的提示:
ERROR: ld.so: object '/usr/lib/arm-linux-gnueabihf/libarmmem.so' from /etc/ld.so.preload cannot be preloaded (wrong ELF class: ELFCLASS32): ignored.
解决方案显而易见:
如果你使用了一张新的SD卡,记得编辑/etc/fstab!
Stage 3:站稳脚跟
*执行apt-get update,提示:
笔者尝试执行sudo apt-get install apt-show-versions,问题解决。
小结
路曼曼其修远兮,吾将上下而求索。
目前整个系统仅仅只是能用,还有许多不完美的地方。
更新
4.11的内核可以使树莓派工作得更好,ACT灯和VCHI将正常工作。
Git切换分支:git checkout rpi-4.11.y