問題タブ [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 に答える
1975 参照

go - cgoを使用せずにGo関数をC呼び出しにバインドする方法は?

私が取り組んでいるプロジェクトでは、Go から一連の C 関数を使用する必要があります。現在の実装では cgo を使用してそれを実現していますが、これを行うとパフォーマンスに大きな影響が生じるため、これを取り除こうとしています。

  • cgo はすべての C コードを syscall としてマークし、必要に応じてスケジューラに新しいスレッドを割り当てさせます。プロジェクトの CPU 時間の約 80% が重い C 作業に費やされているため、すぐに多くのスレッド ( GOMAXPROCS(= 8) ではなく 500 以上) を持つことになり、Linux カーネルはこれをあまり好みません。
  • 通常の「リミッター」アプローチ (バッファリングされたチャネルに cgo 呼び出しをロックさせる) を行うと、多数のミューテックスが発生し、プログラムの速度が低下します。

Go は並行性を管理する優れた方法であるため、このプロジェクトでは引き続き Go を使用したいと考えています。

私が試したこと:

  • のようなものをコメントアウトします (あまり役に立たないようentersyscall()src/runtime/cgocall.go、Go コードの変更は避けたいと思います)。
  • 私のコードを .c ファイルに入れて、.c なしで Go から呼び出しますimport "C"。ここで運が悪い-関数を呼び出すことができず、関数名を書いたときにpackage·function、コンパイラがファイル内の無効な文字について不平を言った。
  • .s ファイルを使用し、それをアセンブリとして記述します。私のasmはそれほど素晴らしいものではなく、理解できませんでした。

だから、私の質問は: cgo のオーバーヘッドを回避しながら、Go から C 関数をどのように使用するのですか?

補足: cgo がすべての呼び出しを syscall としてマークする理由はわかっていますが、この特定のケースでは、呼び出す関数はロックまたは IO でブロックされません。

0 投票する
3 に答える
3499 参照

go - golangのcgoでstd::vectorまたは他のコンテナを使用するには?

golang の gc が十分に効果的ではないため、大量のオブジェクト (約 1 億オブジェクト) をメモリに malloc したいので、c/c++ を使用してメモリを malloc し、std::vector を使用してオブジェクトを保持する必要があります。これは私のコードです。cgo で std コンテナーを使用したいです。

以下のエラーメッセージがあります:

インクルードパスを設定するにはどうすればよいですか、それとも別のアイデアがありますか?

0 投票する
3 に答える
11191 参照

c - cgo のパフォーマンスが遅いのはなぜですか? 私のテストコードに何か問題がありますか?

私はテストを行っています: cgo と純粋な Go 関数の実行時間をそれぞれ 1 億回実行して比較します。cgo 関数は Golang 関数に比べて時間がかかり、この結果に混乱しています。私のテストコードは次のとおりです。

結果は次のとおりです。

結果は、C 関数の呼び出しが Go 関数よりも遅いことを示しています。私のテストコードに何か問題がありますか?

私のシステムは: mac OS X 10.9.4 (13E28)

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

go - クロスコンパイルした CGO バイナリが Raspberry Pi (Raspbian) で実行されないのはなぜですか?

次のコード スニペットをコンパイルすると (プレイグラウンド リンク):

…これらの環境変数を使用:

次のような 1.6Mb のバイナリを取得します。

  • 私のODROID-C1(archlinuxarm.orgからArchを実行しているARMv7)で動作しますが、
  • 私の Raspberry Pi B+ (raspberrypi.org の Raspbian を実行している ARMv6) では動作しません。

Piで実行すると、「Segmentation fault」が表示されます。

これらの環境変数で実行すると:

私はこの出力を得る:

/usr/lib/arm-linux-gnueabihf/libcofi_rpi.sofromを削除/etc/ld.so.preloadすると、 を含む行がないことを除いて、同じ出力が得られますlibcofi_rpi.so

で静的にリンクされたバイナリをビルドしようとすると-tags netgo -a -ldflags "-linkmode external -extldflags -static"、" Illegal instruction" ではなく " Segmentation fault" が表示されます。

Pi 自体でバイナリをビルドしようとしても機能しますが、これをクロスコンパイルしたいと考えています。クロス コンパイルは確かに機能しますが、Raspberry Pi/Raspbian ではなく、ODROID-C1/Arch でのみ機能します。

私が使用する正確なビルド手順は、Docker を使用して再現できます。

ドッカー内で、次を実行します。

これにより、「test」という名前の実行可能ファイルが得られますが、上記のように、Pi では実行されません。

私のテストデバイスに関する情報は次のとおりです。

ラズベリーパイ B+:

インストールされている Bluetooth ライブラリ:

オドロイド-C1:

インストールされた Bluetooth ライブラリと開発ヘッダー ファイル:

Docker ビルド環境

インストールされている Bluetooth 開発ヘッダー:


libbluetooth-devPi で利用可能なバージョンとまったく同じバージョンの を Docker コンテナーにインストールしても、違いはありません。


libbluetooth.soJessie から Wheeziに新しいものをコピーすると、次のエラーが表示されます。


アップデート:

Pi で Arch を試してみたところ、クロス コンパイルされたバイナリでも segfault が発生し、同じメッセージ (" Illegal instruction (core dumped)") がGOARM=5,6または7.

これまでのところ、Pi の CGO コードをクロスコンパイルする方法を見つけていませんlibbluetooth

明日はRaspberry Pi 2でやってみます。

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

go - C コードから Go ライブラリを呼び出す

cgo を使用して Go から C ライブラリを呼び出す方法については、たくさんの情報を見つけましたが、反対に、Go でライブラリを作成し、さまざまな C プログラムでリンク/使用することに興味があります。

これは可能ですか?これに適したリソースはありますか? ありがとう。

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

c++ - Go (golang) と C++ の間でデータ構造 (配列) を交換する

C++ ライブラリを Go で記述されたアプリケーション サーバーに接続しようとしています。目標は、C++ ライブラリとアプリケーション サーバーの両方が共通のデータ構造で動作することです。つまり、次のようになります。

  1. Go アプリサーバーは、C++ ライブラリによって作成された配列にアクセスできます。
  2. C++ ライブラリは、Go アプリサーバーによって作成された配列で機能します。

私は cgo を少しいじり、C++ を接続しましたが、これまでのところすべてが機能していました...しかし、データ構造へのポインタの交換に関しては、私は迷っています。私がこれまでに試したこと:

インターフェイスの実装は次のようになります。

最後に、go の実装は次のようになります。

コンパイルすると、次のエラーが表示されます。

私の質問は、C++ と Go の間でデータ構造へのポインターを交換する方法です。上記では、C++ から GO への道を説明しましたが、逆の方法にも興味があります。

事前にご協力いただきありがとうございます。

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

macos - golang を使用した Mac クロス コンパイル (または代替)

わかりましたので、Mac でAwesomium goラッパーをコンパイルしようとしています(Linux ではすべて正常に動作します)。私の問題は、コンパイルしようとすると、

ld: 警告: ファイル /Library/Frameworks//Awesomium.framework/Awesomium を無視します。ファイルは、リンクされているアーキテクチャではない i386 用にビルドされました (x86_64): /Library/Frameworks//Awesomium.framework/Awesomium アーキテクチャ x86_64 の未定義のシンボル:

罰金。しかし、それにはいくつかの疑問が生じます。まず、Mac 用の x86_64 バージョンをダウンロードするオプションがありませんでした。これは「Mac バージョン」のアーキテクチャではありませんでした。次に、他のいくつかのライブラリをチェックしましたが、x86_64 でビルドされているものはないようです。
osx 専用の i386 バージョンを作成できるのではないかと考えましたが、cgo をクロスコンパイルするのは非常に困難で、不可能だと言う人もいます。

私のオプションは何ですか?