태그 보관물: compilation

compilation

크로스 컴파일 OSX로 이동 하시겠습니까? Windows 및 Linux

Windows 및 Linux 용 바이너리를 빌드하기 위해 OSX에서 go 앱을 크로스 컴파일하려고합니다. 나는 인터넷에서 찾을 수있는 모든 것을 읽었습니다. 내가 찾은 가장 가까운 예가 게시되었습니다 (gonuts 메일 링리스트에 대한 많은 미완성 토론 제외).

http://solovyov.net/en/2012/03/09/cross-compiling-go/

그러나 내 설치에서 작동하지 않습니다. 나는 1.0.2 갔다. 1.0.2가 최신 버전이므로 위의 모든 예제가이 버전에 적용되지 않는 것으로 보입니다.

./make.bash --no-cleanENV vars를 386 / windows로 설정 하려고 시도 했지만 빌드가 진행되지만 설치를 위해 빌드가 진행되며 darwin/amd64다른 컴파일러를 빌드한다고 가정하는 ENV에 설정된 것을 완전히 무시합니다.

어떻게 할 수 있는지 조언합니다 (완전히 할 수 있다면)?



답변

Go 1.5에서는 크로스 컴파일 프로세스가 개선 된 것 같습니다. 즉, 현재 내장되어 있습니다. 어떤 ./make.bash-ing하거나 brew필요 -ing. 프로세스는 여기에 나와 있지만 나와 같은 TLDR 사용자를 위해 설명 되어 있습니다. GOOSGOARCH환경 변수를 설정 하고 이동 빌드를 실행하십시오.

저와 같은 게으른 복사 붙여 넣기를 위해 * nix 시스템을 사용하는 경우 다음과 같이하십시오.

env GOOS=linux GOARCH=arm go build -v github.com/path/to/your/app

심지어 env그 명령에 대해서만 환경 변수를 완전히 무료로 설정할 수 있는 트릭을 배웠습니다 .


답변

golang-nuts의 친절하고 환자의 도움 덕분에 조리법은 다음과 같습니다.

1) 다른 대상 플랫폼과 아키텍처에 맞게 Go 컴파일러를 컴파일해야합니다. 이것은 go 설치의 src 폴더에서 수행됩니다. 필자의 경우 Go 설치가 /usr/local/go컴파일러를 컴파일하기 위해 위치 하므로 make유틸리티 를 실행해야 합니다. 이 작업을 수행하기 전에 몇 가지주의 사항을 알아야합니다.

크로스 컴파일시 CGO 라이브러리에 대한 문제가 있으므로 CGO 라이브러리를 비활성화해야합니다.

해당 폴더에서 컴파일을 수행해야하므로 소스 디렉토리로 위치를 변경하여 컴파일

cd /usr/local/go/src

그런 다음 Go 컴파일러를 컴파일하십시오.

sudo GOOS=windows GOARCH=386 CGO_ENABLED=0 ./make.bash --no-clean

GOOS 및 GOARCH 매개 변수를 변경하여 크로스 컴파일하려는 각 OS 및 아키텍처에 대해이 단계를 반복해야합니다.

내가하는 것처럼 사용자 모드로 작업하는 경우 Go 컴파일러가 시스템 디렉토리에 있기 때문에 sudo가 필요합니다. 그렇지 않으면 수퍼 유저로 로그인해야합니다. Mac에서는 SU 액세스를 활성화 / 구성해야 할 수 있지만 (기본적으로 제공되지 않음) Go를 설치 한 경우 이미 루트 액세스 권한이있을 수 있습니다.

2) 모든 크로스 컴파일러가 작성되면 다음 설정을 사용하여 애플리케이션을 행복하게 크로스 컴파일 할 수 있습니다.

GOOS=windows GOARCH=386 go build -o appname.exe appname.go

GOOS=linux GOARCH=386 CGO_ENABLED=0 go build -o appname.linux appname.go

GOOS 및 GOARCH를 빌드하려는 대상으로 변경하십시오.

CGO에 문제가 발생하면 명령 행에 CGO_ENABLED = 0을 포함하십시오. 또한 Linux 및 Mac 용 바이너리에는 확장명이 없으므로 다른 파일을 사용하기 위해 확장명을 추가 할 수 있습니다. -o 스위치는 출력 파일을 c / c ++의 이전 컴파일러와 비슷하게 만들도록 지시합니다. 따라서 위에서 사용 된 appname.linux는 다른 확장자 일 수 있습니다.


답변

OS X에서 Homebrew 를 사용 하는 경우 더 간단한 솔루션이 있습니다.

$ brew install go --with-cc-common # Linux, Darwin, and Windows

또는..

$ brew install go --with-cc-all # All the cross-compilers

reinstall이미 go설치 한 경우 사용하십시오 .


답변

Docker를 사용하면이 작업을 쉽게 수행 할 수 있으므로 추가 라이브러리가 필요하지 않습니다. 이 명령을 실행하십시오.

docker run --rm -it -v "$GOPATH":/go -w /go/src/github.com/iron-io/ironcli golang:1.4.2-cross sh -c '
for GOOS in darwin linux windows; do
  for GOARCH in 386 amd64; do
    echo "Building $GOOS-$GOARCH"
    export GOOS=$GOOS
    export GOARCH=$GOARCH
    go build -o bin/ironcli-$GOOS-$GOARCH
  done
done
'

이 게시물에서 자세한 내용을 찾을 수 있습니다 :
https://medium.com/iron-io-blog/how-to-cross-compile-go-programs-using-docker-beaa102a316d


답변

많은 플랫폼에서 실행 파일을 만드는 과정은 약간 지루할 수 있으므로 스크립트를 사용하는 것이 좋습니다.

#!/usr/bin/env bash

package=$1
if [[ -z "$package" ]]; then
  echo "usage: $0 <package-name>"
  exit 1
fi
package_name=$package

#the full list of the platforms: https://golang.org/doc/install/source#environment
platforms=(
"darwin/386"
"dragonfly/amd64"
"freebsd/386"
"freebsd/amd64"
"freebsd/arm"
"linux/386"
"linux/amd64"
"linux/arm"
"linux/arm64"
"netbsd/386"
"netbsd/amd64"
"netbsd/arm"
"openbsd/386"
"openbsd/amd64"
"openbsd/arm"
"plan9/386"
"plan9/amd64"
"solaris/amd64"
"windows/amd64"
"windows/386" )

for platform in "${platforms[@]}"
do
    platform_split=(${platform//\// })
    GOOS=${platform_split[0]}
    GOARCH=${platform_split[1]}
    output_name=$package_name'-'$GOOS'-'$GOARCH
    if [ $GOOS = "windows" ]; then
        output_name+='.exe'
    fi

    env GOOS=$GOOS GOARCH=$GOARCH go build -o $output_name $package
    if [ $? -ne 0 ]; then
        echo 'An error has occurred! Aborting the script execution...'
        exit 1
    fi
done

OSX에서만이 스크립트를 확인했습니다.

요점-go- executable-build.sh


답변

OSX 타겟팅 창에서 CGO를 활성화하고 크로스 컴파일 해야하는 사람들을 위해

나는 필요 CGO는 내가 가져온했기 때문에 내 Mac에서 Windows 용 컴파일하는 동안 사용할 수 https://github.com/mattn/go-sqlite3 하고 그것을 필요로했다. 다른 답변에 따라 컴파일하면 오류가 발생했습니다.

/usr/local/go/src/runtime/cgo/gcc_windows_amd64.c:8:10: fatal error: 'windows.h' file not found

당신이 나와 같고 CGO로 컴파일해야한다면. 이것이 내가 한 일입니다.

1. CGO 종속 라이브러리가있는 창을 위해 크로스 컴파일 할 것입니다. 먼저 다음과 같이 설치된 크로스 컴파일러가 필요합니다mingw-w64

brew install mingw-w64

아마도 여기에 설치 될 것입니다 /usr/local/opt/mingw-w64/bin/.

2. 다른 답변과 마찬가지로 지금 우리의 go arch를 go 컴파일러 툴체인에 추가해야합니다. 컴파일러를 컴파일하려면 컴파일러 (이상한 문장)가 필요합니다. 컴파일러를 컴파일하려면 별도의 사전 빌드 된 컴파일러가 필요합니다. 우리는 미리 빌드 된 바이너리를 다운로드하거나 폴더의 소스에서 빌드 ~/Documents/go
할 수 있습니다 : 이제 우리는 최고 답변에 따라 Go 컴파일러를 향상시킬 수 있지만 이번에는 CGO_ENABLED=1별도의 사전 빌드 컴파일러 와 함께 GOROOT_BOOTSTRAP(Pooya는 내 사용자 이름입니다) :

cd /usr/local/go/src
sudo GOOS=windows GOARCH=amd64 CGO_ENABLED=1 GOROOT_BOOTSTRAP=/Users/Pooya/Documents/go ./make.bash --no-clean
sudo GOOS=windows GOARCH=386 CGO_ENABLED=1 GOROOT_BOOTSTRAP=/Users/Pooya/Documents/go ./make.bash --no-clean

3. Go 코드를 컴파일하는 동안 mingwCGO가 활성화 된 go 파일 타겟팅 창을 컴파일 하는 데 사용합니다.

GOOS="windows" GOARCH="386" CGO_ENABLED="1" CC="/usr/local/opt/mingw-w64/bin/i686-w64-mingw32-gcc" go build hello.go
GOOS="windows" GOARCH="amd64" CGO_ENABLED="1" CC="/usr/local/opt/mingw-w64/bin/x86_64-w64-mingw32-gcc" go build hello.go


답변