樹莓派編譯法
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