当前位置:首页 » 编程软件 » 树莓派编译法

树莓派编译法

发布时间: 2024-09-16 14:11:07

‘壹’ 如何编译armlinux的go

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的设置选择分区格式

  • 然后开干:
    sudo debootstrap --verbose --arch=arm64 stretch . https://mirrors.ustc.e.cn/debian/
    编辑sources.list:

  • deb http://mirrors.ustc.e.cn/debian/ stretch maindeb http://mirrors.ustc.e.cn/archive.raspberrypi.org/ jessie main non-free contrib

  • apt.conf:
    APT::Default-Release "stretch";
    Chroot和之前的准备工作:

  • 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:这两个想必大家都听说过吧……

  • 退出Chroot环境,复制配置文件及其它核心组件,例如:

  • /boot/lib/moles/etc/passwd/etc/shadow/etc/sudoers/etc/hostapd/etc/default/etc/udhcpd.conf/etc/udev//etc/dnsmasq.conf

  • etc...

  • 注:笔者实际上把整个(除了/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.
    解决方案显而易见:

  • sudo mv /etc/ld.so.preload /etc/ld.so.preload.bak

  • sudo touch /etc/ld.so.preload

  • 如果你使用了一张新的SD卡,记得编辑/etc/fstab!

    Stage 3:站稳脚跟

    *执行apt-get update,提示:

  • 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 apt-get install apt-show-versions,问题解决。

    小结

    路曼曼其修远兮,吾将上下而求索。

    目前整个系统仅仅只是能用,还有许多不完美的地方。

    更新

    4.11的内核可以使树莓派工作得更好,ACT灯和VCHI将正常工作。
    Git切换分支:git checkout rpi-4.11.y

热点内容
动态规划01背包算法 发布:2024-11-05 22:17:40 浏览:849
nasm编译器如何安装 发布:2024-11-05 22:01:13 浏览:180
登录密码在微信的哪里 发布:2024-11-05 22:00:29 浏览:739
c防止反编译工具 发布:2024-11-05 21:56:14 浏览:247
安卓虚拟机怎么用 发布:2024-11-05 21:52:48 浏览:344
php时间搜索 发布:2024-11-05 20:58:36 浏览:478
燕山大学编译原理期末考试题 发布:2024-11-05 20:13:54 浏览:527
华为电脑出现临时服务器 发布:2024-11-05 20:05:08 浏览:408
斗战神免费挖矿脚本 发布:2024-11-05 19:53:25 浏览:665
网吧服务器分别是什么 发布:2024-11-05 19:45:32 浏览:392