gocv icon indicating copy to clipboard operation
gocv copied to clipboard

Use docker to build static build environment arm64 platform packaging failed

Open yh4922 opened this issue 1 year ago • 0 comments

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

yh4922 avatar Feb 22 '23 02:02 yh4922