V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
kuxiaobai
V2EX  ›  Go 编程语言

请教一下各位老哥,在 Windows go 程序交叉编译时候使用什么编译链?

  •  
  •   kuxiaobai · 2 天前 · 1384 次点击

    我搞了个小项目,用的是 goreleaser 来编译各环境应用,由于需要用到 sqlite 便在配置文件中把CGO_ENABLED 的值设置为 1 ,但是在编译过程中遇到各种各样的问题。

    build failed after 10s                   error=failed to build for darwin_arm64: exit status 1: # runtime/cgo
    cgo: C compiler "clang" not found: exec: "clang": executable file not found in %PATH%
    -----------
      ⨯ build failed after 11s                   error=failed to build for linux_arm_6: exit status 1: # runtime/cgo
    gcc: error: unrecognized command line option '-marm'; did you mean '-mabm'?
    ----------
    failed to build for linux_amd64_v1: exit status 1: # runtime/cgo
    arm-linux-gnueabi-gcc: error: unrecognized command-line option '-m64'
    
    

    我觉得我已经脑掺了🙈🙈🙈

    15 条回复    2024-09-18 16:43:04 +08:00
    ysc3839
        1
    ysc3839  
       2 天前 via Android
    不是写了 clang 吗?
    要不然去 LLVM 官网下,要不然用 MSYS2 里面的 clang 。
    kuxiaobai
        2
    kuxiaobai  
    OP
       2 天前
    @ysc3839 我已经在此 https://releases.llvm.org/ 下载并安装了,也设置了环境变量,之后就这样:
    ```
    ⨯ build failed after 11s error=failed to build for linux_arm_6: exit status 1: # runtime/cgo
    gcc: error: unrecognized command line option '-marm'; did you mean '-mabm'?
    ```
    kuxiaobai
        3
    kuxiaobai  
    OP
       2 天前
    @ysc3839 感谢老哥回复,现在心乱了,找时间我在研究
    0o0O0o0O0o
        4
    0o0O0o0O0o  
       2 天前 via iPhone
    既然你用 goreleaser ,那就用它的容器

    docker run --rm -v /source:/app -w /app goreleaser/goreleaser --verbose release --snapshot --clean --skip=announce,publish,validate
    xinge666
        5
    xinge666  
       2 天前 via iPhone
    sqlite 不是有库吗为什么要用 c 版的
    ysc3839
        6
    ysc3839  
       2 天前
    @kuxiaobai 抱歉,我看错了,你需要的是交叉编译的工具链,那可能只能自己从源代码编译 darwin clang 了。
    monkeyWie
        7
    monkeyWie  
       2 天前
    下载 zig ,然后有个 zig 的交叉编译工具链好像可以
    body007
        8
    body007  
       2 天前
    这是以前弄得交叉编译 docker 制作方法。

    https://github.com/jan-bar/xgo/blob/master/docker/readme.md

    这里有个在 Linux 的 docker 交叉编译 window 的 sqlite 脚本,不过当时没有研究交叉编译 arm 的方法。但我感觉就是安装 arm64-gcc 的编译工具,然后给 go 设置环境变量即可。

    https://github.com/jan-bar/xgo/blob/master/tests/sqlite/build.sh

    还有这个纯 go 的 sqlite 驱动可以试试看: https://gitlab.com/cznic/sqlite
    kuxiaobai
        9
    kuxiaobai  
    OP
       1 天前
    @0o0O0o0O0o 感谢老哥,我也试过用 docker 但编译 arm 还是会遇到问题
    kuxiaobai
        10
    kuxiaobai  
    OP
       1 天前
    @body007 感谢 老哥,amd 的没得问题,就是在 arm 编译上遇到了问题,sqlite 的驱动我用 https://github.com/glebarez/sqlite
    flyqie
        11
    flyqie  
       1 天前 via Android   ❤️ 1
    说真的,这种需求建议上专门的 cicd 环境搞,cgo 的交叉编译真的不太好做,除了 android 这种以外,剩下都建议在目标系统上做。
    Kisesy
        12
    Kisesy  
       1 天前
    sqlite3 库换成 https://github.com/ncruces/go-sqlite3, 不用 C
    jim9606
        13
    jim9606  
       1 天前 via Android
    小项目别折腾了吧,找纯 go 实现的 sqlite 客户端库。
    intersect
        14
    intersect  
       1 天前
    sqlite 使用 github.com/mattn/go-sqlite3 ,Window11+WSL 下编译起来还算方便

    编译参数参考:
    export CGO_ENABLED=1

    # AMD64
    #export GOOS=linux
    #export GOARCH=amd64

    export GOOS=linux
    # arm
    #export GOARCH=arm
    #export CC=arm-linux-gnueabihf-gcc

    # aarch64
    # apt-get install -y aarch64-linux-gnu-gcc
    export GOARCH=arm64
    export CC=aarch64-linux-gnu-gcc
    xsen
        15
    xsen  
       17 小时 14 分钟前
    sqlite 有 pure-go 版本的,
    https://github.com/glebarez/go-sqlite.git
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5717 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 01:57 · PVG 09:57 · LAX 18:57 · JFK 21:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.