9

いくつかのパッケージを含む Windows 用の Go プログラムを作成しています。これらのパッケージの 1 つは、CGo を使用して、いくつかの .h および .c ファイルで定義されたいくつかの関数を呼び出しています。これらの .c ファイルは、 windows.h に依存しています。

Windows プラットフォームでの開発は非常に面倒なので、このファイルの関数のモックアップを作成し、代わりに Linux で開発したいと考えています。しかし、コンパイルしようとすると、次のようになります。

fatal error: windows.h: No such file or directory

go ツールは、Windows に依存するファイルをコンパイルしようとするためです。これを回避する方法はありますか?私は次のようなものを置くことを知っています

#ifdef ..
import x
#endif

ベストプラクティスではありませんが、この場合、「Linux」ファイルのみをコンパイルできるようにする必要があります。

4

1 に答える 1

16

ビルド制約のドキュメントからの引用:

ビルド制約は、ファイルをパッケージに含める条件をリストするディレクティブ +build で始まる行コメントです。制約は (Go だけでなく) どの種類のソース ファイルにも記述できますが、ファイルの先頭近くに記述し、空白行とその他の行コメントのみを前に付ける必要があります。

ビルドの制約をパッケージ ドキュメントと区別するには、一連のビルドの制約の後に空白行を続ける必要があります。

ビルド制約は、スペースで区切られたオプションの OR として評価されます。各オプションは、カンマ区切りの用語の AND として評価されます。各用語は、英数字の単語、または ! が前に付いたその否定語です。つまり、ビルドの制約:

// +build linux,386 darwin,!cgo

次のブール式に対応します。

(linux AND 386) OR (darwin AND (NOT cgo))

ファイルには複数のビルド制約が含まれる場合があります。全体の制約は、個々の制約の AND です。つまり、ビルドの制約:

// +build linux darwin
// +build 386

次のブール式に対応します。

(linux OR darwin) AND 386

特定のビルド中に、次の単語が満たされます。

  • runtime.GOOS で綴られたターゲット オペレーティング システム
  • runtime.GOARCH で綴られたターゲット アーキテクチャ
  • 使用されているコンパイラ、「gc」または「gccgo」
  • 「cgo」、ctxt.CgoEnabled が true の場合
  • 「go1.1」、Go バージョン 1.1 以降
  • ctxt.BuildTags にリストされている追加の単語

拡張子と可能な _test サフィックスを削除した後のファイル名が、次のパターンのいずれかに一致する場合:

*_GOOS
*_GOARCH
*_GOOS_GOARCH

(例: source_windows_amd64.go) またはリテラル:

GOOS
GOARCH

(例: windows.go) GOOS と GOARCH がそれぞれ既知のオペレーティング システムとアーキテクチャの値を表している場合、ファイルには、これらの用語を必要とする暗黙のビルド制約があると見なされます。

ファイルがビルド対象と見なされないようにするには:

// +build ignore

(他の不満足な言葉も同様に機能しますが、「無視」は慣例です。)

Linux および OS X でのみ、cgo を使用する場合にのみファイルをビルドするには、次のようにします。

// +build linux,cgo darwin,cgo

このようなファイルは、通常、他のシステムのデフォルト機能を実装する別のファイルとペアになっています。この場合、次の制約があります。

// +build !linux,!darwin !cgo

ファイルに dns_windows.go という名前を付けると、Windows 用のパッケージをビルドするときにのみ含まれます。同様に、math_386.s は、32 ビット x86 用のパッケージをビルドする場合にのみ含まれます。

于 2013-09-02T11:09:53.080 に答える