web-dev-qa-db-ja.com

WindowsからLinux / Ubuntuへの1.7クロスコンパイルに進む

Windows10にGO1.7をインストールしました。テストプログラムを作成しましたが、Windowsで完全に機能します。次のステップは、Ubuntuを使用してDocker仮想マシンで実行してみることです。

私は見つけました ここ それを行う方法についてのいくつかの情報

set GOARCH=AMD64
set GOOS=linux
go tool dist install -v pkg/runtime
go install -v -a std

Cmdで1行目と2行目を実行しましたが、問題はありません。 3行目でエラーが発生しました

go tool dist: open C:\Go\src\pkg\runtime: The system cannot find the path specified.

このフォルダを手動でチェックすると、Windows専用のランタイムがあります

enter image description here

問題は、Linux用にどこでどのようにダウンロードできるかです。または多分私がやっているのは完全に間違った方法です...

更新2017年9月2日

提案されたように走った

set GOARCH=AMD64
set GOOS=linux
go build -o "myapp"

このファイルを共有フォルダーにコピーした後、そこのフォームを別の共有されていないフォルダーにコピーして(説明されている問題を回避するために ここ )、実行しました

root@7dd1655ae5db:/__notshared# ./myapp
bash: ./myapp: cannot execute binary file: Exec format error

ファイルパッケージをダウンロードした後、ファイルをチェックしました

root@7dd1655ae5db:/__notshared# file myapp
myapp: PE32+ executable (console) x86-64 (stripped to external PDB), for MS Windows

ビルド中にLinux実行可能ファイルが作成されなかったようです。

8
Vitalii

私は問題とその解決策を見つけました。

私のWindows10では、これらのコマンド

set GOARCH=AMD64
set GOOS=linux

cmdとpowershellコンソールでも実際には何もしませんでした!それが機能する唯一の方法は、コントロールパネル->システム->システムの詳細設定->環境変数を開き、そこに手動で追加する必要があるということです。

enter image description here

開発にVisualStudio Codeを使用する場合は、再起動することを忘れないでください。

2017年2月24日更新

代わりに、上記のすべてで、このようにWindowsPowerShellで変数を設定できます

$ env:GOOS = "linux"

それをコンソールに読んでください

$ env:GOOS

3
Vitalii

その他の質問は少し古いです(2013年から)。

クロスプラットフォームのサポートは大きく進化しました。必要なのは、環境変数(GOARCHGOOS)を変更し、go buildを実行することだけです。

mainパッケージのフォルダーに移動し、次の手順を実行します。

set GOARCH=AMD64
set GOOS=linux
go build

結果のバイナリの名前は次のように変更できます。

go build -o "myapp"

LinuxでWindowsAMD64用にアプリをコンパイルするには、1つのコマンドで十分であることに注意してください(mainパッケージのフォルダー内)。

GOOS=windows GOARCH=AMD64 go build

これはブログ投稿でも確認されています: Dave Cheney:Go 1.5とのクロスコンパイル

Go 1.5を使用してGoプログラムをクロスコンパイルするには、プロセスは次のとおりです。

  1. GOOSGOARCHをターゲットの値に設定します オペレーティングシステムとアーキテクチャ

  2. go build -v YOURPACKAGEを実行します

ノート

GOPATHにパッケージをコンパイルしてインストールするため、go installを実行する必要はなく、実行しないでください。これは、多くの場合、望ましくありません。クロスコンパイルを行うことは、アプリとパッケージを開発/テストするためのものではありません。別のシステム/コンピューターで実行する単一のバイナリーを作成することです。

go buildは何もインストールせず、実行可能バイナリを生成するだけです。詳細については、 ビルドビルドとは何ですか? を参照してください。

ブログ投稿でも確認されています: Dave Cheney:Go 1.5とのクロスコンパイル

クロスコンパイルするときは、go buildではなくgo installを使用する必要があります。これは、go buildgo installよりも望ましい数少ないケースの1つです。

この理由は、go installは、コンパイルされたパッケージ.aファイルを、ソースコードのルートと一致するpkg/ディレクトリに常にキャッシュするためです。

6
icza

Go1.14を搭載したWindows10で私がうまくいったのは、次のとおりです。

go env -w GOARCH=AMD64
go env -w GOOS=linux
go build -o test-linux test.go

それでおしまい。

これをWindowsコマンドプロンプトとWindowsPowerShellの両方で試しました。結果に違いはありません。

バイナリファイルをテキストエディタで開くと、MZ(Windows)ではなくELF(Linux)で始まることがわかります。

指定されたアーキテクチャのLinuxマシン(RHEL 7.3)で実行したところ、正しく機能しました。それは正しい出力を与えました。

ファイルをLinuxマシンにコピーした後、実行可能にする必要がありました。

$ chmod +x test-linux

それから私はそれを実行することができました:

$ ./test-linux

Linuxで次のコマンドを実行して、ファイルの詳細を取得することもできます。

$ file test-linux
test-linux: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, not stripped

もちろん、アーキテクチャがすでにAMD64である場合は、再度設定する必要はありません。 GOOSを設定するだけです。

クロスコンパイルが終了したら、GOOSwindowsに戻すこともできます。 WindowsコマンドのプロンプトとPowerShellを閉じ、go envを実行してGo環境変数のリストを表示すると、GOOSlinuxの値を保持していました。 Windowsを再起動しようとしませんでした。したがって、Windows用に再度コンパイルする場合は次のようにします。

go env -w GOOS=windows

ここに示すように、正しいケーシングを使用する必要があります。たとえば、WindowsまたはLinuxは機能しません。

0
ivanbgd