問題タブ [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.
types - Golang: CGo を使用して外部から見えるように C フィールドをエクスポートします
背景: 使用している C ライブラリの周りに薄い Go ラッパーを本質的に提供するパッケージを作成しようとしています。他のいくつかのパッケージは C ライブラリの低レベル機能に依存しており、大量の Go ラッパー コードをコピーパスタしたくないため、このパッケージは意図的に非常に未加工です。
次のような C 構造体があるとします。
CGo では、C 構造体をラップして、次のように新しいメソッドを作成します。
問題は、パッケージの外では、C 構造体のフィールドにアクセスできないことです。
これを回避する簡単な方法はありますか (すべてのフィールドのアクセサ メソッドを作成する以外に)?
c - Goコードで定義された型の構造体を変更するC関数を書くことは可能ですか?
これはこの質問のフォローアップです。私は真実ではないかもしれないと仮定したので、私はそれについて明示的に尋ねています. これが実際に可能かどうかを尋ねるのを忘れていたので、これについては既にissue #8114を提出しました。
cgo を使用すると、次のように Go コードを C 型で動作させることができます。
逆は可能ですか?つまり、go 型で動作する C 関数を作成していますか? これの具体的なポイントは、上記のリンクの質問で概説されています。ユニオンまたはビットフィールドを使用するか、アラインメントによって Go コードと互換性がなくなるため、Go コードからアクセスできない C 構造体をマーシャリングしたいと考えています。
c - Go から setns を呼び出すと、mnt 名前空間の EINVAL が返されます
setns
C コードは正常に動作し、名前空間に正しく入りますが、Go コードは、名前空間に入る呼び出しから常に EINVAL を返すようmnt
です。.so
Go1.2
でいくつかの順列 ( cgo および external を使用した埋め込み C コードを含む) と現在のヒントを試しました1.3
。
コードをステップ実行するgdb
と、両方のシーケンスがまったく同じ方法で呼び出さsetns
れlibc
ていることがわかります (または、私にはそう見えます)。
問題と思われるものを以下のコードに落とし込みました。私は何を間違っていますか?
設定
クイック ビジーボックス コンテナーを開始するためのシェル エイリアスがあります。
これを実行するstartbb
と、コンテナが起動し、その PID が出力されます。
lxc-checkconfig
出力:
uname -a
生成:
ワーキング C コード
次の C コードは問題なく動作します。
でコンパイルした後gcc -o checkns checkns.c
の出力sudo ./checkns <PID>
は次のとおりです。
失敗した Go コード
逆に、次の Go コード (同一である必要があります) はうまく機能しません。
代わりに、実行すると以下がsudo go run main.go <PID>
生成されます。
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
cgo - cgo を使用している場合、これ以上ライブラリをインポートできません
主に学習経験として C でいくつかの Go コードを書き直そうとしていますが、他に答えが見つからない問題に遭遇しました。
次のコードを実行しようとしています:
安全でないインポートをコメントアウトすると問題なく動作しますが、追加すると go install/test コマンドで次のエラーが発生します。
37: エラー: 'ConvertStringToArray' が宣言されていません (この関数で最初に使用)
これは、他のライブラリをインポートしようとするたびにも当てはまります。何か助けがあれば、または関連する問題へのリダイレクトさえあれば幸いです(私はすでに見ましたが、見落としている可能性があります)。
ありがとう、デイブ
c - GolangでC変数を解放しますか?
Go で C 変数を使用している場合、どの変数を解放する必要があるかについて混乱しています。
たとえば、これを行うと:
そのメモリは、私が呼び出すまで割り当てられていますC.free(unsafe.Pointer(s))
か、それとも関数が終了したときにGoによってガベージコレクションされても問題ありませんか?
それとも、解放する必要があるのは、インポートされた C コードから作成された変数のみであり、Go コードから作成されたこれらの C 変数はガベージ コレクションの対象になりますか?
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 ステートメントの間にスペースを追加できないのはなぜですか?
この種のエラーが再び表示された場合、どのようにデバッグするのが最善ですか?