Docker 및 스크래치를 기본 이미지로 사용하여 정적 바이너리를 생성하려고 시도하는 동안 사용자에게 오류가 발생했습니다. 바이너리를 실행합니다. 문제 해결 후 정적 바이너리를 생성하려면 CGO_ENABLED=0 및 -ldflags '-extldflags "-static"'을 사용해야 한다는 사실이 발견되었습니다. 질문이 생깁니다: 왜 이 두 플래그가 모두 필요한가요?
-a 플래그는 이미 최신 상태인 패키지를 강제로 다시 빌드하는 데 사용됩니다. 이 컨텍스트에서는 지정된 플래그를 사용하여 모든 종속성이 다시 빌드되도록 합니다.
-ldflags 플래그는 go 도구 링크, 도구에 전달할 추가 인수를 지정합니다. Go 소스 코드를 바이너리로 연결하는 역할을 담당합니다. '-extldflags "-static"' 인수는 링커에게 동적 연결 대신 정적 연결을 사용하도록 지시합니다. 정적 링크는 필요한 모든 라이브러리를 바이너리에 포함하므로 런타임 시 외부 종속성이 필요하지 않습니다.
CGO 또는 Cgo 패키지를 사용하면 Go 프로그램이 C와 상호 작용할 수 있습니다. 암호. CGO_ENABLED=0으로 CGO를 비활성화하면 컴파일러가 연결을 위한 C 코드를 생성할 수 없습니다. CGO 생성 코드는 공유 라이브러리에 대한 종속성을 포함하여 바이너리를 비정적으로 만들 수 있으므로 정적 바이너리를 생성하는 데 중요합니다.
CGO_ENABLED=0 및 -ldflags 조합 '-extldflags "-static"'이 필요한 이유는 다음과 같습니다.
이러한 플래그를 함께 사용하면 외부에 의존하지 않는 정적 바이너리를 생성한다는 목표를 달성할 수 있습니다. 런타임에 라이브러리를 사용하세요.
위 내용은 정적 Go 바이너리를 생성하려면 CGO_ENABLED=0 및 -ldflags \'-extldflags \'-static\'\'이 모두 필요한 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!