gocv
gocv copied to clipboard
Use docker to build static build environment arm64 platform packaging failed
Static compilation of gocv fails on arm64 platform
go build -tags static --ldflags '-extldflags "-static"' -o static_version ./cmd/version/main.go:
#6 30.26 # command-line-arguments
#6 30.26 /usr/local/go/pkg/tool/linux_arm64/link: running g++ failed: exit status 1
#6 30.26 /usr/bin/ld: cannot find -lippiw
#6 30.26 /usr/bin/ld: cannot find -lippicv
#6 30.26 /usr/bin/ld: /usr/local/lib/libopencv_core.a(opencl_core.cpp.o): in function `opencl_check_fn(int)':
#6 30.26 opencl_core.cpp:(.text._ZL15opencl_check_fni+0x1b0): warning: Using 'dlopen' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
#6 30.26 /usr/bin/ld: cannot find -lquadmath
#6 30.26 collect2: error: ld returned 1 exit status
My docker build steps
Compile the base image
Dockerfile
FROM ubuntu:20.04
WORKDIR /init
ENV DEBIAN_FRONTEND=noninteractive
# Set the golang environment variable as it is always the same
ENV GO111MODULE=on
ENV GOROOT=/usr/local/go
ENV PATH=$PATH:$GOROOT/bin
# Packaging configuration
ENV VERSION=0.0.1
ENV PKG_NAME=main
# build script
COPY build.sh /init/build.sh
build.sh
cd /app
go mod tidy
# build
if [ $(arch) = "x86_64" ]; then
CGO_ENABLED=1 GOOS=linux GOARCH=amd64 go build -tags static --ldflags '-extldflags "-static"' -o /output/$VERSION/$PKG_NAME_x86_64
else
CGO_ENABLED=1 GOOS=linux GOARCH=arm64 go build -tags static --ldflags '-extldflags "-static"' -o /output/$VERSION/$PKG_NAME_arm64
fi
# arm64
docker buildx build -t go_ubuntu:arm64 --platform=linux/arm64 -o type=docker .
# amd64
docker buildx build -t go_ubuntu:amd64 --platform=linux/amd64 -o type=docker .
Create go_ubuntu
container
# arm64
docker run -d --privileged --network host --ipc=host --name go_build_arm go_ubuntu:arm64 tail -f /dev/null
# amd64
docker run -d --privileged --network host --ipc=host --name go_build_amd go_ubuntu:amd64 tail -f /dev/null
into the container
# arm64
docker exec -it go_build_arm /bin/bash
# amd64
docker exec -it go_build_amd /bin/bash
install dependencies
apt -y update
install golang
# arm64
wget -c https://go.dev/dl/go1.19.4.linux-arm64.tar.gz -O - | tar -xz -C /usr/local
# amd64
wget -c https://go.dev/dl/go1.19.4.linux-amd64.tar.gz -O - | tar -xz -C /usr/local
install gocv
git clone https://github.com/hybridgroup/gocv
cd gocv && make install_static # Use static compilation
In this step, the
arm64
platform build will report an error
go build -tags static --ldflags '-extldflags "-static"' -o static_version ./cmd/version/main.go:
#6 30.26 # command-line-arguments
#6 30.26 /usr/local/go/pkg/tool/linux_arm64/link: running g++ failed: exit status 1
#6 30.26 /usr/bin/ld: cannot find -lippiw
#6 30.26 /usr/bin/ld: cannot find -lippicv
#6 30.26 /usr/bin/ld: /usr/local/lib/libopencv_core.a(opencl_core.cpp.o): in function `opencl_check_fn(int)':
#6 30.26 opencl_core.cpp:(.text._ZL15opencl_check_fni+0x1b0): warning: Using 'dlopen' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
#6 30.26 /usr/bin/ld: cannot find -lquadmath
#6 30.26 collect2: error: ld returned 1 exit status
export container as image
# arm64
docker commit go_build_arm go_build:arm64
# amd64
docker commit go_build_amd go_build:amd64
build command
# arm64
docker run --rm -t -e VERSION=0.0.1 -e PKG_NAME=main -v /usr/bin/qemu-aarch64-static:/usr/bin/qemu-aarch64-static -v /civi/gopath/src/go_image:/app -v /civi/gopath/src/go_image/dist:/output go_build:arm64 sh /init/build.sh
# amd64
docker run --rm -t -e VERSION=0.0.1 -e PKG_NAME=main -v /civi/gopath/src/go_image:/app -v /civi/gopath/src/go_image/dist:/output go_build:amd64 sh /init/build.sh