問題タブ [cgo]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
go - Go への既存の C コードの統合。unsigned char poiner の結果を []byte に変換する
簡単な例を次に示します。
その結果、私はこのようなものを持っています
へのポインタdata
、の最初の文字、data
およびサイズ。data
しかし、できればgoコードで使用する[]バイト型として、実際の値を取得するにはどうすればよいですか?
言い換えれば - に変換する方法unsigned char *
は[]byte
?
go - GoLang / CGO: Go から Mach API host_statistics() を呼び出す際の問題
次の C コード フラグメントを使用して、OS X の CPU 負荷を取得します。
cgo チュートリアルを読んだ後、このコードを Go に移植しようとしました。結果のコードは次のようになります。
ただし、コードをビルドしようとすると、次のエラー メッセージが表示されます。
cgo がタイプについて不平を言う理由がわかりません。host_statistics() の署名は、mach ヘッダーで次のように定義されています。
c - C 定数での Cgo リンカー エラー
cgo を使用して C ライブラリをラップしていますが、奇妙な一連のリンカー エラーが発生しました。問題を次のように要約しました。
ファイル header.h には次の内容が含まれます
そして test.go が含まれています
実行するgo run test.go
と、次のエラーが表示されます。
これについて 2 つの質問があります。
- リンカーが定義済みの定数と関係があるのはなぜですか?
- 、、が未定義として表示されるのに、そうでないの
CONSTANT1
はなぜですか?CONSTANT3
CONSTANT4
CONSTANT2
前もって感謝します。
*編集: 他の値 (int など) として定義された定数は正常に機能します。
*Edit2: go バージョン go1.1.2 linux/amd64 を使用
*Edit3: 失敗の完全な例:
私は C OpenLDAP ライブラリを使用しており、LDAP_SASL_SIMPLE
定数を使用したいと考えています。それは次のように定義されldap.h
ています
LDAP_SASL_NULL
定数は同じエラーを返します。
最小限のデモ用 go プログラム:
go - cgo パッケージのコンパイル時に go build が C 標準ライブラリを見つけられない
ラズベリーパイでgoプロジェクトをコンパイルしようとしています。
プロジェクトには 5 つのファイル、2 つの小さな.c
ファイルとそれに対応するファイル (これらのファイルの 1 つは私のコード.h
です。もう 1 つは base64 ライブラリ.go
を呼び出します) と、 ..c
cgo
ラズベリーパイで単独でCコードのみ(その呼び出しとすべてを含む)をコンパイルすると、gcc
構成なしでうまく機能します。
x86
Linux Ubuntu マシンでgo プロジェクト全体をコンパイルするとgo build
、かなりうまくいきます。
しかしgo build
、ラズベリー pi で go プロジェクトをコンパイルしようとすると、C ライブラリが取得されません。
<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
project.c
そして1ゴー:
このことを機能させるには、この宣言のどこを、何を、どのように変更する必要がありますか? そして、なぜ私のx86 Linuxで動作したのですか?
go - 構造体と構造体の配列を Go から C 関数に渡す
この問題で立ち往生。渡された構造の最初のメンバーのみを取得できます...何が間違っていますか? Go から C に構造体を渡す正しい方法は何ですか?
これがうまくいかない私の例です:
c - mmap バッファからファイル ハンドルへ
ファイル記述子(をサポートする)を「偽造」する必要があり、fstat
このようにします。
ファイル ハンドルへの書き込みがコメント アウトされている場所がわかります。
割り当てられた領域にバッファーを書き込まないと、空になります。mmap
と組み合わせてMAP_FIXED
、提供されたバッファーのアドレスを使用して、コンテンツをその領域にマッピングすることを望んでいました。
write
呼び出しがコピーされるため、メモリ使用量が2倍になると思います。私は本当にしなければならないのwrite
ですか?
go - Go で可変長 C 関数を使用する
私はshm_open
cgo で使用します。shm_open
Linuxでは3つの引数で定義されています
一方、OSX (Darwin) では、3rd モード フラグはオプションです。
これにより、OSX でモードを渡そうとすると、CGO で問題が発生します。2つしか期待されていないのに、3つの引数を渡すと不平を言います。
どうすればこれを回避できますか?
garbage-collection - CGoを使用してCコードからGo変数への参照を保持する安全な方法はありますか?
CGo を使用して C コードと Go をインターフェイスする場合、C 側で Go 変数への参照を保持している場合、そのオブジェクトがガベージ コレクターによって解放されるリスクがありますか?それとも GC は、によって管理される変数内のポインターを認識しますか? C面?
私が求めていることを説明するために、次のサンプル プログラムを検討してください。
行くコード:
C コード:
との呼び出しfoo->ch
の間にガベージ コレクターによって解放されるリスクがありますか? もしそうなら、C側からGo変数を固定して、参照を保持している間に解放されないようにする方法はありますか?foo_new
foo_send