問題タブ [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 - 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 でブロックされません。
go - golangのcgoでstd::vectorまたは他のコンテナを使用するには?
golang の gc が十分に効果的ではないため、大量のオブジェクト (約 1 億オブジェクト) をメモリに malloc したいので、c/c++ を使用してメモリを malloc し、std::vector を使用してオブジェクトを保持する必要があります。これは私のコードです。cgo で std コンテナーを使用したいです。
以下のエラーメッセージがあります:
インクルードパスを設定するにはどうすればよいですか、それとも別のアイデアがありますか?
c - cgo のパフォーマンスが遅いのはなぜですか? 私のテストコードに何か問題がありますか?
私はテストを行っています: cgo と純粋な Go 関数の実行時間をそれぞれ 1 億回実行して比較します。cgo 関数は Golang 関数に比べて時間がかかり、この結果に混乱しています。私のテストコードは次のとおりです。
結果は次のとおりです。
結果は、C 関数の呼び出しが Go 関数よりも遅いことを示しています。私のテストコードに何か問題がありますか?
私のシステムは: mac OS X 10.9.4 (13E28)
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.so
fromを削除/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-dev
Pi で利用可能なバージョンとまったく同じバージョンの を Docker コンテナーにインストールしても、違いはありません。
libbluetooth.so
Jessie から Wheeziに新しいものをコピーすると、次のエラーが表示されます。
アップデート:
Pi で Arch を試してみたところ、クロス コンパイルされたバイナリでも segfault が発生し、同じメッセージ (" Illegal instruction (core dumped)
") がGOARM=5
,6
または7
.
これまでのところ、Pi の CGO コードをクロスコンパイルする方法を見つけていませんlibbluetooth
。
明日はRaspberry Pi 2でやってみます。
go - C コードから Go ライブラリを呼び出す
cgo を使用して Go から C ライブラリを呼び出す方法については、たくさんの情報を見つけましたが、反対に、Go でライブラリを作成し、さまざまな C プログラムでリンク/使用することに興味があります。
これは可能ですか?これに適したリソースはありますか? ありがとう。
c++ - Go (golang) と C++ の間でデータ構造 (配列) を交換する
C++ ライブラリを Go で記述されたアプリケーション サーバーに接続しようとしています。目標は、C++ ライブラリとアプリケーション サーバーの両方が共通のデータ構造で動作することです。つまり、次のようになります。
- Go アプリサーバーは、C++ ライブラリによって作成された配列にアクセスできます。
- C++ ライブラリは、Go アプリサーバーによって作成された配列で機能します。
私は cgo を少しいじり、C++ を接続しましたが、これまでのところすべてが機能していました...しかし、データ構造へのポインタの交換に関しては、私は迷っています。私がこれまでに試したこと:
インターフェイスの実装は次のようになります。
最後に、go の実装は次のようになります。
コンパイルすると、次のエラーが表示されます。
私の質問は、C++ と Go の間でデータ構造へのポインターを交換する方法です。上記では、C++ から GO への道を説明しましたが、逆の方法にも興味があります。
事前にご協力いただきありがとうございます。
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 をクロスコンパイルするのは非常に困難で、不可能だと言う人もいます。
私のオプションは何ですか?