問題タブ [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.

0 投票する
1 に答える
1587 参照

types - Golang: CGo を使用して外部から見えるように C フィールドをエクスポートします

背景: 使用している C ライブラリの周りに薄い Go ラッパーを本質的に提供するパッケージを作成しようとしています。他のいくつかのパッケージは C ライブラリの低レベル機能に依存しており、大量の Go ラッパー コードをコピーパスタしたくないため、このパッケージは意図的に非常に未加工です。

次のような C 構造体があるとします。

CGo では、C 構造体をラップして、次のように新しいメソッドを作成します。

問題は、パッケージの外では、C 構造体のフィールドにアクセスできないことです。

これを回避する簡単な方法はありますか (すべてのフィールドのアクセサ メソッドを作成する以外に)?

0 投票する
2 に答える
232 参照

c - Goコードで定義された型の構造体を変更するC関数を書くことは可能ですか?

これはこの質問のフォローアップです。私は真実ではないかもしれないと仮定したので、私はそれについて明示的に尋ねています. これが実際に可能かどうかを尋ねるのを忘れていたので、これについては既にissue #8114を提出しました。


cgo を使用すると、次のように Go コードを C 型で動作させることができます。

逆は可能ですか?つまり、go 型で動作する C 関数を作成していますか? これの具体的なポイントは、上記のリンクの質問で概説されています。ユニオンまたはビットフィールドを使用するか、アラインメントによって Go コードと互換性がなくなるため、Go コードからアクセスできない C 構造体をマーシャリングしたいと考えています。

0 投票する
1 に答える
2806 参照

c - Go から setns を呼び出すと、mnt 名前空間の EINVAL が返されます

setnsC コードは正常に動作し、名前空間に正しく入りますが、Go コードは、名前空間に入る呼び出しから常に EINVAL を返すようmntです。.soGo1.2でいくつかの順列 ( cgo および external を使用した埋め込み C コードを含む) と現在のヒントを試しました1.3

コードをステップ実行するgdbと、両方のシーケンスがまったく同じ方法で呼び出さsetnslibcていることがわかります (または、私にはそう見えます)。

問題と思われるものを以下のコードに落とし込みました。私は何を間違っていますか?

設定

クイック ビジーボックス コンテナーを開始するためのシェル エイリアスがあります。

これを実行するstartbbと、コンテナが起動し、その PID が出力されます。

lxc-checkconfig出力:

uname -a生成:

ワーキング C コード

次の C コードは問題なく動作します。

でコンパイルした後gcc -o checkns checkns.cの出力sudo ./checkns <PID>は次のとおりです。

失敗した Go コード

逆に、次の Go コード (同一である必要があります) はうまく機能しません。

代わりに、実行すると以下がsudo go run main.go <PID>生成されます。

0 投票する
1 に答える
1407 参照

sqlite - 2 つの cgo ベースのライブラリを含めると、「重複したシンボル参照」が発生するのはなぜですか?

私は次のものを構築しようとしています(ビルドに行きます):

エラーが発生します:

シンボル参照の重複: github.com/d2g/unqlitego( .text) と github.com/mattn/go-sqlite3(.text) の両方で __moddi3

go バージョン go1.3.1 windows/386 を実行しています。

私は何か間違ったことをしていますか?この種の問題をどのように解決しますか?

これは OS/Go バージョン/アーキテクチャ固有のバグですか? (あなたの出力で「それは私のために働く」と感謝しますgo version

これをすべてレポに入れたので、go get github.com/d2g/issue-duplicate_symbol.

コメントによると、ログオンした Windows 386 の問題のように見えます: https://code.google.com/p/go/issues/detail?id=8702

0 投票する
1 に答える
28 参照

cgo - cgo を使用している場合、これ以上ライブラリをインポートできません

主に学習経験として C でいくつかの Go コードを書き直そうとしていますが、他に答えが見つからない問題に遭遇しました。

次のコードを実行しようとしています:

安全でないインポートをコメントアウトすると問題なく動作しますが、追加すると go install/test コマンドで次のエラーが発生します。

37: エラー: 'ConvertStringToArray' が宣言されていません (この関数で最初に使用)

これは、他のライブラリをインポートしようとするたびにも当てはまります。何か助けがあれば、または関連する問題へのリダイレクトさえあれば幸いです(私はすでに見ましたが、見落としている可能性があります)。

ありがとう、デイブ

0 投票する
1 に答える
3558 参照

c - GolangでC変数を解放しますか?

Go で C 変数を使用している場合、どの変数を解放する必要があるかについて混乱しています。

たとえば、これを行うと:

そのメモリは、私が呼び出すまで割り当てられていますC.free(unsafe.Pointer(s))か、それとも関数が終了したときにGoによってガベージコレクションされても問題ありませんか?

それとも、解放する必要があるのは、インポートされた C コードから作成された変数のみであり、Go コードから作成されたこれらの C 変数はガベージ コレクションの対象になりますか?

0 投票する
2 に答える
430 参照

go - c 関数を呼び出すと、「import fmt」、「import C」の順序でビルド エラーが発生するのはなぜですか?

次の簡単なテスト go コードがあります: call_c.go

go build call_c.go」を使用してプログラムをビルドすると、正常にビルドされます。

しかし、単純に「import fmt」、「import C」の順序を逆にするか、C /* */ ブロック コードと最初の import ステートメントの間に改行を追加すると、「go build call_c.go」コマンドが返されることがわかりました。エラー:

そこにいる専門家のホリネズミへの質問:

goでインポートの順序が重要なのはなぜですか?

C ブロックと最初の import ステートメントの間にスペースを追加できないのはなぜですか?

この種のエラーが再び表示された場合、どのようにデバッグするのが最善ですか?

0 投票する
2 に答える
143 参照

c - Cgo を使用して MATLAB 配列内の値にアクセスするにはどうすればよいですか?

MatLab C API と Go のCgo パッケージを使用して、Go プログラムでマット ファイル内の 24x3000000 行列を読み込もうとしています。マトリックスの次元を正常に読み取ることができますが、各セル内の値にアクセスするにはどうすればよいですか? (最終的には、この行列をスライスとして Go プログラムに返すことが目標です。)

参考までに、C 用のマトリックス ライブラリ API を次に示します