天天看點

gf架構使用sqlite3資料庫後交叉編譯cgo适配arm64-linux

gf架構使用sqlite3資料庫後交叉編譯cgo适配arm64-linux

文章目錄

  • ​​gf架構使用sqlite3資料庫後交叉編譯cgo适配arm64-linux​​
  • ​​1. 前言​​
  • ​​2. 解決方案​​
  • ​​3. wsl+Windows交叉編譯cgo工程​​
  • ​​3.1 簡述cgo程式交叉編譯​​
  • ​​3.2 安裝交叉編譯工具鍊​​
  • ​​3.3 交叉編譯包含cgo依賴的go項目​​
  • ​​3.4 交叉編譯依賴sqlite3的gf工程​​
  • ​​4. 最後​​

1. 前言

之前已經說過我們将使用openwrt+nginx+go+sqlite3的方式在openwrt上開發适配業務的web,而架構使用的go-frame,目前go語言操作sqlite3的相關庫都使用了cgo,是以我們不得不面對交叉編譯cgo的問題。

2. 解決方案

我們考慮了兩個解決方案:1、openwrt下安裝openwrt-go,然後在openwrt下編譯工程;2、安裝arm-linux交叉編譯工具鍊,然後交叉編譯基于cgo程式。

雖然我們的openwrt為19.07.1是支援go語言的,但是編譯固件時沒有添加openwrt-go,是以為了避免重新編譯固件以及更新固件,暫時沒有選擇這種方案,其實添加一個go環境還是蠻不錯的(https://openwrt.org/packages/pkgdata/golang-src)。

确實直接使用交叉編譯工具鍊來編譯cgo工程更合理一些,畢竟openwrt大多情況下還是嵌入式環境,盡量還是考慮這種交叉編譯方案好一些,其實也沒有那麼複雜,安裝交叉編譯工具鍊,然後編譯時指定對應環境變量即可。

3. wsl+Windows交叉編譯cgo工程

3.1 簡述cgo程式交叉編譯

Windows安裝相關交叉編譯工具鍊很少,基本上都是在Ubuntu等類似的主控端上搭建交叉編譯環境,然後交叉編譯适合目标機的程式,對于cgo也是如此,你可以簡單了解cgo就是c程式套殼一層go接口,是以交叉編譯cgo程式可以說就是交叉編譯c/c++程式,是以我們搭建交叉編譯環境,然後指定編譯的CC、CXX環境變量即可,由于目前wsl已經足夠成熟(wsl2和vmware強制而二選一,你能明白作業系統的重要性了吧),是以目前使用wsl+Windows的模式編譯項目,項目在Windows下,但是交叉編譯環境安裝在wsl中,然後利用wsl中的交叉編譯環境編譯Windows下的項目。

3.2 安裝交叉編譯工具鍊

由于我們是交叉編譯适配aar64+linux的程式,是以相對簡單一些,直接安裝現成的交叉編譯工具鍊即可(如果是其它的系統和cpu架構,需要根據具體情況而定,但是思路都是安裝相關系統和cpu架構的gcc和g++及對應依賴庫,友善後續編譯時使用):

sudo apt-get update
sudo apt install      

3.3 交叉編譯包含cgo依賴的go項目

之後在wsl中編譯時指定對應的環境變量即可(注意結合go的特性進行靜态連結,這樣雖然會導緻程式大一些,但是避免了動态庫的依賴,更友善移植):

CGO_ENABLED=1 CC=aarch64-linux-gnu-gcc CXX=aarch64-linux-gnu-g++ GOOS=linux GOARCH=arm64 go build -o ./bin/server main.go -ldflags '-s -w --extldflags "-static -fpic"'      

-ldflags '-s -w’可以去掉一些符号表,這樣不但可以減少程式的體積,實際釋出後在一定程式上也可以避免程式被二進制逆向破解。static那部分則是靜态連結方式,将相關庫都靜态連結,這樣生成的程式就不必依賴可能的動态庫了。

3.4 交叉編譯依賴sqlite3的gf工程

交叉編譯時使用gf建議隻設定config.toml中的extra,當成go build指令來使用:

config.toml:

[gfcli]
    # 自定義DAO生成配置(預設是讀取database配置)
    [[gfcli.gen.dao]]
        link   = "sqlite:./gateway.db"
        tables = "user, login_log, oper_log"
        descriptionTag = true
        noModelComment = true
    [gfcli.build]
        cgo      = 1
        extra    = "-ldflags '-s -w --extldflags \"-static -fpic\"'"      

編譯時:

CGO_ENABLED=1 CC=aarch64-linux-gnu-gcc CXX=aarch64-linux-gnu-g++ GOOS=linux GOARCH=arm64 gf build main.go -o ./bin/TSL-G10-SW-GATEWAY-WEB --pack public --swagger -v 1.0.0      

至于gf架構如何使用sqlite3可以看這裡:https://goframe.org/pages/viewpage.action?pageId=17203966

4. 最後

繼續閱讀