8

ラズベリーパイでgoプロジェクトをコンパイルしようとしています。

プロジェクトには 5 つのファイル、2 つの小さな.cファイルとそれに対応するファイル (これらのファイルの 1 つは私のコード.hです。もう 1 つは base64 ライブラリ.goを呼び出します) と、 ..ccgo

ラズベリーパイで単独でCコードのみ(その呼び出しとすべてを含む)をコンパイルすると、gcc構成なしでうまく機能します。

x86Linux Ubuntu マシンでgo プロジェクト全体をコンパイルするとgo build、かなりうまくいきます。

しかしgo build、ラズベリー pi で go プロジェクトをコンパイルしようとすると、C ライブラリが取得されません。

fiatjaf@raspberrypi ~/g/s/b/f/project> go build -x
WORK=/tmp/go-build702187084
mkdir -p $WORK/bitbucket.org/fiatjaf/project/_obj/
cd /home/fiatjaf/go/src/bitbucket.org/fiatjaf/project
/usr/lib/go/pkg/tool/linux_arm/5c -FVw -I $WORK/bitbucket.org/fiatjaf/project/_obj/ -I /usr/lib/go/pkg/linux_arm -o $WORK/bitbucket.org/fiatjaf/project/_obj/base64.5 -DGOOS_linux -DGOARCH_arm ./base64.c
# bitbucket.org/fiatjaf/project
./base64.c:2 5c: No such file or directory: math.h

<stdlib.h>(問題が発生する前に置くと<math.h>、問題はmath.hがないことではないと思います)私は次のことを試みました:

  • ファイル// #cgo CFLAGS: -I/usr/includeに追加.go
  • 追加// #cgo LDFLAGS: -I/usr/include(これらのフラグの正しい使い方がわかりません)
  • 使用するgo build -ldflags '-I/usr/include'

go が base64.c を でコンパイルしようとする理由がわかりません-I /usr/lib/go/pkg/linux_arm。本当にしないでください。誰か助けて。

編集:プロジェクトの構造に関する注意を明確にする:

2 つの C (および対応する H) の 5 つのファイルがあります。

base64.c

#include <math.h>
#include <stdint.h>
#include <stdlib.h>
... // definitions of functions used at project.c

project.c

#include <stdlib.h>
#include <string.h>
#include "base64.h"
... // functions used at project.go

そして1ゴー:

...

// #include <stdlib.h>
// #include <string.h>
// #include "project.h"
// #cgo CFLAGS: -I/usr/include
// #cgo LDFLAGS: -lm
import "C"
...

このことを機能させるには、この宣言のどこを、何を、どのように変更する必要がありますか? そして、なぜ私のx86 Linuxで動作したのですか?

4

2 に答える 2

3

cgo インライン構文

go ファイルの cgo パラメーターの正しい構文は次のとおりです。

// #cgo CFLAGS: -I/usr/include

#との間の空白なしcgo構文の詳細については、 cmd/cgoを参照してください。

-ldflags パラメータ

go-ldflagsパラメーターは、go リンカー (5l、6l、8l、...) にパラメーターを渡します。パラメータがCリンカーに渡されたとしても、リンカーはインクルードを処理せず、コンパイラーが処理するため、これは何の役にも立ちません。

残念ながら、このパラメーターはここでは役に立ちません。#cgo関連するすべてのパラメーターは、タグを使用して go ソース ファイルで構成する必要があります。

その他。ノート

を使用している場合は、math.hおそらく libmath をリンクする必要があります。これを行うには、go ソース ファイルに次のように記述します。

// #cgo LDFLAGS: -lm
于 2013-10-05T22:27:22.133 に答える
1

私の問題は、フラグを設定していないことCGO_ENABLEDに関連していたようです。

確かなことはわかりませんが、Raspbian リポジトリ (デフォルトでは CGO が無効になっているようです) から Go をアンインストールし、ソースから Go をインストールしたため (x86 Linux で作成したのと同じように)、そう思われます。働き始めました。

于 2013-10-07T01:58:11.307 に答える