본문 바로가기
개발

Go 언어와 M1 Mac에서의 크로스 컴파일 문제 해결 가이드

by 닉네임 입니다 2024. 11. 12.
728x90
반응형

Go 언어로 M1 Mac에서의 크로스 컴파일 이슈 해결하기

안녕하세요, 여러분! 오늘은 Go 언어(골랑)를 사용하여 M1 칩이 장착된 맥북에서 발생하는 크로스 컴파일 이슈를 해결하는 방법에 대해 알아보겠습니다. 이 포스팅에서는 그 과정을 단계별로 나누고, 여러분이 놓칠 수 있는 세부 사항도 자세히 설명드릴 예정이니, 주목해 주세요!

들어가며

M1 맥북은 그 성능이 뛰어나지만, 특정 소프트웨어와 툴을 사용할 때 크로스 컴파일을 해야 하는 상황이 종종 발생합니다. 예를 들어, 우리는 ARM64 아키텍처에서 AMD64(x86) 아키텍처로 도커 이미지를 생성해야 할 때, 몇 가지 어려움에 직면할 수 있습니다. 오늘 포스팅을 통해 여러분이 이러한 문제를 극복할 수 있도록 도와드리겠습니다.

1. 크로스 컴파일 방법

먼저, Go 언어로 크로스 컴파일하는 방법을 살펴보겠습니다. 두 가지 아키텍처를 대상으로 하는 컴파일 명령어는 다음과 같습니다.

  1. ARM64
  2. $ GOARCH=arm64 GOOS=linux go build -o main
  3. AMD64
  4. $ GOARCH=amd64 GOOS=linux go build -o main

2. 에러 로그 및 해결법

에러를 마주칠 때는 당황하지 말고, 그 원인을 파악해야 합니다. 몇 가지 가능성 있는 에러와 해결 방법을 살펴보겠습니다.

  • 문제: Binary was compiled with 'CGO_ENABLED=0', go-sqlite3 requires cgo to work.
    • 해결: CGO_ENABLED=0으로 설정되어 있으면 sqlite3가 실행되지 않으므로, CGO_ENABLED=1로 변경하여 다시 빌드해주어야 합니다.
  • 문제: unrecognized command line option '-m64'
    • 해결: M1 칩에서는 AMD 환경으로 Go 언어를 빌드하기 위한 적합한 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 작성하기

이제 Dockerfile을 작성하여 위의 문제를 해결할 수 있는 방법을 살펴보겠습니다. 다음과 같이 작성할 수 있습니다.

FROM golang:latest as builder

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

RUN dpkg --add-architecture amd64 \r
    && apt update \r
    && 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" ]

이 Dockerfile은 M1 칩에서 성공적으로 인간이 작성한 프로그램을 빌드하여 실행할 수 있도록 도와줍니다.

마무리하며

이번 포스팅에서는 M1 칩에서 Go 언어로의 크로스 컴파일 이슈를 해결하는 방법에 대해 살펴보았습니다. 각 단계를 따라 하며 수정할 수 있는 다양한 방법도 함께 공유했습니다. 이러한 정보가 여러분의 개발 환경에서 도움이 되기를 바랍니다!

앞으로도 프로그래밍에 대한 다양한 팁과 트릭을 공유할 예정이니, 많은 관심 부탁드립니다! 궁금하신 사항이나 추가적인 질문이 있으시다면 언제든지 댓글로 남겨주세요. 그럼 다음 포스팅에서 만나요!

728x90
반응형