首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >交叉编译go(lang)应用程序,带有用于高寒linux (musl)的aarch64,带有本地libs,因此启用了CGO

交叉编译go(lang)应用程序,带有用于高寒linux (musl)的aarch64,带有本地libs,因此启用了CGO
EN

Unix & Linux用户
提问于 2021-08-27 21:27:08
回答 1查看 1.4K关注 0票数 2

背景

我正在编写一个开源的GTK应用程序亚音速API客户端,它:

  • 目标首先是移动友好Linux,如postmarketOS (高寒linux),墨比安 (debian)
  • 将来也会扩展到桌面Linux、Windows和Mac,而不是安卓或iOS,因为他们已经有了。
  • 至少在aarch64x86_64上是可用的
  • 依赖于本地的lib,如portaudiolibasoundlibopus
  • 所以它需要启用CGO

我还没有发布应用程序,因为我自己托管我的git,我必须做一些额外的配置。它要到2021年10月底才能买到。

应用程序成功地编译(在主机上)并运行在我的主PC上,即x86_64 fedora。

App成功编译(在码头上)并在aarch64 glibc发行版上运行,比如Mobian

这是Dockerfile:

代码语言:javascript
复制
FROM golang:1.17-bullseye
LABEL os=linux
LABEL arch=arm64
ENV GOOS=linux
ENV GOARCH=arm64
ENV CGO_ENABLED=1
ENV CC=aarch64-linux-gnu-gcc
ENV PATH="/go/bin/${GOOS}_${GOARCH}:${PATH}"
ENV PKG_CONFIG_PATH=/usr/lib/aarch64-linux-gnu/pkgconfig
# install build & runtime dependencies
RUN dpkg --add-architecture arm64 
RUN apt update && apt upgrade -y 
RUN apt install -y --no-install-recommends \
        protobuf-compiler \
        upx \
        gcc-aarch64-linux-gnu \
        libc6-dev-arm64-cross \
        pkg-config \
        libasound2-dev:arm64 \
        libgtk-3-dev:arm64 \
        libcairo2-dev:arm64 \
        libglib2.0-dev:arm64 \
        libgdk-pixbuf2.0-dev:arm64 \
        libsamplerate0:arm64 \
        libsamplerate0-dev:arm64 \
        libopusfile0:arm64 \
        libopusfile-dev:arm64 \
        libopus0:arm64 \
        libopus-dev:arm64 \
        libportaudio2:arm64 \
        portaudio19-dev:arm64 
# install build dependencies (code generators)
RUN go get github.com/hajimehoshi/oto \
    && go get github.com/faiface/beep \
    && go get github.com/faiface/beep/flac \
    && go get github.com/faiface/beep/speaker \
    && go get github.com/faiface/beep/mp3 \
    && go get github.com/faiface/beep/vorbis \
    && go get github.com/faiface/beep/wav\
    && go get github.com/gotk3/gotk3 \
    && go get github.com/delucks/go-subsonic \
    && go get github.com/hashicorp/go-retryablehttp \
    && go get github.com/zalando/go-keyring \
    && go get github.com/emirpasic/gods/lists/ \
    && go get github.com/emirpasic/gods/lists/arraylist \

问题

  1. 我不能在postmarketOS上运行Mobian二进制文件,因为高寒linux使用的是musl。file输出为:ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-aarch64.so.1, (...) for GNU/Linux 3.7.0. not stripped
  2. 我还没有在debian中使用musl工具链,因为它是32个二进制可执行文件,图像是64位。
  3. 我在高寒地区找不到任何关于多重拱的信息,所以我可能无法使用码头图像目标:1.17- x86_64上的高寒(我还必须找到本地的libs打包)。

我希望这只是我的配置的问题,如果它是可能的话,我喜欢解决与码头,因为我想在未来使用CI/CD。

资源、想法、解决方案--

  • 我有raspberry pi与debian安装了一些服务。我可以使用本机musl工具链和debian aarch64对接容器,但在生产管道中它并不方便。而且我还没试过这个。

好读

  1. 交叉编译CGO项目(也与码头一起)
  2. 跨平台musl工具链的交叉编译
  3. 与高寒linux和go二进制文件相关的堆栈溢出线程
EN

回答 1

Unix & Linux用户

发布于 2023-02-07 01:47:03

我遇到了一个类似的问题,我需要用cgo构建一个静态的Go二进制文件,这个二进制文件最终将运行在一个带有arm64体系结构的高寒容器中,但是必须构建在一个带有x86_64体系结构的高寒容器中(我没有控制CI/CD运行器架构)。

我通过下载交叉编译器(CC)并指定在Go构建期间使用它来工作。

下面是一个在容器用户主目录中下载/提取CC并在基于/usr/src/example的go构建中使用它的示例,该构建生成一个名为exampleApp的可执行文件。

代码语言:javascript
复制
wget -P ~ https://musl.cc/aarch64-linux-musl-cross.tgz
tar -xvf ~/aarch64-linux-musl-cross.tgz -C ~
cd /usr/src/example
GOOS=linux GOARCH=arm64 CGO_ENABLED=1 CC=~/aarch64-linux-musl-cross/bin/aarch64-linux-musl-gcc go build -o exampleApp -a -ldflags=-extldflags=-static . 

file输出上运行exe,验证它是为aarch64静态链接的。那时,我能够在其他地方的arm64高寒容器中运行它。

票数 0
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/666559

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档