3

これが基本的な質問であることを願っています。C で記述されたライブラリの関数を含む Go パッケージをビルドしようとしています。構造は基本的に次のとおりです。

package too

/*
#cgo LDFLAGS: -L/usr/local/lib include -lbar
#include mybar.h
*/
import "C"

func MyGoWrapper () {
  C.orig_func()
}

go build foo.goの「未定義の参照」で実行が失敗しますorig_funcヘッダーはmybar.h;であることに注意してください。orig_func元のライブラリに含まれていなかったプロトタイプを作成しました。Go ビルドにリンクする前に、このヘッダー ファイルを含めてライブラリを最初に再コンパイルする必要がありますか? それとも、何か他のことを完全に誤解していますか?

4

1 に答える 1

2

外部ライブラリにリンクする場合は、ターゲット アーキテクチャ用に個別にコンパイルする必要があります。ライブラリをコンパイルするために/ (またはその他cgoのもの) を置き換えることはできません。パッケージ ディレクトリ内のいくつかのファイルをビルドする方法しか認識していないため、ライブラリのビルド プロセスはより複雑になる可能性があります。configuremake.c


クロスコンパイル時に外部ライブラリにリンクするというより大きなタスクを達成する方法がよくわかりません(そして、あなたがすでに何をしたのかわかりません)。クロスコンパイルに関する (クローズされた) Go バグは、cgoここで役に立ちます。で説明されているいくつかの環境変数セットを使用して、Go ツールチェーンをビルドすることができますgodoc cmd/cgo

ビルドのクロス コンパイル中に cgo を有効にするには、make.bash を使用して Go ツールをビルドするときに CGO_ENABLED 環境変数を 1 に設定します。また、CC_FOR_TARGET をターゲットの C クロスコンパイラに設定します。CC は、ホスト用のコンパイルに使用されます。

Go ツールがビルドされた後、go コマンドを実行すると、CC_FOR_TARGET は無視されます。make.bash を実行するときの CC_FOR_TARGET の値は、デフォルトのコンパイラです。ただし、go ツールの実行時にコンパイラを制御するために、CC_FOR_TARGET ではなく、環境変数 CC を設定できます。

CXX_FOR_TARGET は、C++ コードに対して同様に機能します。

このバグには、使用している誰か-ldflags="-extld=$(CC)"($(CC)は使用したいクロスコンパイラーの名前) についても言及されています。

あなたのサンプルコードには明示的なものがありますが-L/usr/local/lib、それはうまくいかないと思います.ターゲット用のライブラリを構築するときはlib、ホストアーキテクチャ用とは別のディレクトリにそれらを置きたいと思うでしょう. たとえば、この ARM クロスコンパイル HOWTO では、/usr/local/arm-linuxいくつかの場所でプレフィックスまたは install_root を使用しています。

于 2014-11-29T07:20:09.763 に答える