我正在编写一个开源的GTK应用程序亚音速API客户端,它:
aarch64和x86_64上是可用的portaudio、libasound、libopusCGO我还没有发布应用程序,因为我自己托管我的git,我必须做一些额外的配置。它要到2021年10月底才能买到。
应用程序成功地编译(在主机上)并运行在我的主PC上,即x86_64 fedora。
App成功编译(在码头上)并在aarch64 glibc发行版上运行,比如Mobian
这是Dockerfile:
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 \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。我希望这只是我的配置的问题,如果它是可能的话,我喜欢解决与码头,因为我想在未来使用CI/CD。
发布于 2023-02-07 01:47:03
我遇到了一个类似的问题,我需要用cgo构建一个静态的Go二进制文件,这个二进制文件最终将运行在一个带有arm64体系结构的高寒容器中,但是必须构建在一个带有x86_64体系结构的高寒容器中(我没有控制CI/CD运行器架构)。
我通过下载交叉编译器(CC)并指定在Go构建期间使用它来工作。
下面是一个在容器用户主目录中下载/提取CC并在基于/usr/src/example的go构建中使用它的示例,该构建生成一个名为exampleApp的可执行文件。
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高寒容器中运行它。
https://unix.stackexchange.com/questions/666559
复制相似问题