본문 바로가기
golang

[golang] 맥북 m1칩에서 golang 크로스 컴파일 이슈 해결 방법

by devjh 2022. 10. 13.
반응형

m1맥북에서 test db로 sqlite3를 사용하던도중 amd64환경(x86)으로 도커 이미지를 생성해야 되는 상황에 겪은 이슈입니다. 주로 c컴파일러가 없어서 발생하는 문제로 CGO_ENABLED를 조작할때 참고할 수 있습니다.

1. 크로스 컴파일 방법

(1). arm64

$ GOARCH=arm64 GOOS=linux go build -o main

 

(2) amd64

맥북에서 amd64(x86)로 빌드할때 주의하여야 합니다(크로스 컴파일)

$ GOARCH=amd64 GOOS=linux go build -o main

 

2. 에러 로그 및 해결법

Binary was compiled with 'CGO_ENABLED=0', go-sqlite3 requires cgo to work. This is a stub
-> CGO_ENABLED=0 으로 설정되어있으면 sqlite3가 안돌아가므로 CGO_ENABLED=1로 변경해서 빌드
unrecognized commnad line option '-m64'
-> m1칩에서는 amd환경으로 golang을 빌드하기 위한 적당한 gcc가 없으므로 x86용 gcc를 설치
qemu-x86_64: Could not open '/lib64/ld-linux-x86-64.so.2': No such file or directory
-> 실행할 이미지에 플랫폼을 linux/amd64로 설정

3. dockerfile

m1칩에서 해당 이슈를 맞게 되면 아래를 참고해서 빌드 or 도커파일을 작성해서 해결합니다.

FROM golang:latest as builder

WORKDIR /app
COPY ./ ./
RUN go mod download

RUN dpkg --add-architecture amd64 \
    && apt update \
    && apt-get install -y --no-install-recommends gcc-x86-64-linux-gnu libc6-dev-amd64-cross

RUN CGO_ENABLED=1 CC=x86_64-linux-gnu-gcc GOARCH=amd64 GOOS=linux go build -o main

FROM --platform=linux/amd64 ubuntu

WORKDIR /root

COPY --from=builder /app/main .

WORKDIR /app

CMD [ "./main" ]

 

반응형

댓글