問題タブ [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.
c++ - Visual Studio を搭載した Windows で swig -go を使用する
Windowsでswigを使用してgolang call c++ dllを使用したい。(Linux の gc コンパイラは成功しました。) しかし、いくつかの問題があります。これがサンプルです。
ここで、このコマンドを使用してラップ ファイルを生成します。
次に、VS で空の dll プロジェクトを作成し、sample.h とヘッダー ファイルを追加し、sample.cpp と sample_wrap.cxx をソース ファイルに追加し、sample.i をプロジェクトに追加します。
ソリューションのビルド、sample.dll の生成
以下のように cmd を使用して、sample.a を生成します。
次に、sample.a をインストールして (問題を回避するため)、test.go を実行します。
問題はここにあります.test.goを実行すると、エラーが発生しました:
問題を解決するにはどうすればよいですか (dll と test.go は同じディレクトリにあります)。ありがとう!私が見逃した追加情報が必要な場合は、お尋ねください。
アレックス
go - Golang(cgo)-任意のvoid*インターフェース
データを任意に保持するために使用できるvoid*データフィールドを持つ構造体を持つCライブラリをラップしています。これを慣用的なGoでラップするための最良の方法は(可能であれば)何でしょうか?
構造体は非常に単純です:
私は次のようなことをしたいと思っていました:
これは機能せず、とにかく明らかに間違ったアプローチです。
[] byteソースを使用して長さフィールドでvoid*データを正常に設定しましたが、この長さのないインターフェイスではわかりません。
go - cgoとpkg-config
GraphicsMagickをcgoで実行したい。
次に、「go install」を実行すると、次のようになります。
しかし、シェルで「pkg-config GraphicsMagick-config」を実行すれば、問題ありません。
linker - Go - LDFLAGS: -w -hostobj でエラーが発生する
C コードを呼び出す Go パッケージを作成しています。ホスト リンカーを呼び出す必要がありますが、残念ながら-hostobj
フラグを追加すると、次のエラーが発生します。
オペレーティング システムは Linux、アーキテクチャは amd64 です。
すべてのフラグは次のとおりです。
私は何を間違っていますか?
opengl - Go から OpenGL を使用する
Go プログラム内から OpenGL を使用しようとしています。すべての部品が揃っていると思いますが、まだ完全には実行できていません。
私の C コンパイラはmingw の 64 ビット版です。それは私の変数にあり、ドキュメント%PATH%
の乱数の例で動作することを確認しました。cgo
\mingw\x86_64-w64-mingw32
bin、lib、および include フォルダーをmingw-w64 インストールの同等のフォルダーにコピーして、64 ビット GLEW 1.9.0 をインストールしました。
を実行しようとするとgo get github.com/go-gl/gl
、go は次のように応答します。
これらのエラーは、 までの値に対して同様の方法で続きます__cgo_enum__15
。また、エントリごとに Go 側からいくつかの一致エラーが発生します。
これを機能させるために何が欠けているかについてのアイデアはありますか?
編集: Go側からの「一致する」ログは次のとおりです。
5 ~ 15ごとに 1 つあり__cgodebug_data[]
ます。
編集 2:ログを添付するように求められました。GCC 4.8でコンパイルした場合は次のようになり、4.7 と 4.6 でコンパイルした場合は次のようになります。
windows - cgo で Windows ライブラリを使用する
TagLibを利用する Go パッケージをビルドしようとしていますが、コンパイルされたライブラリを cgo で使用する方法を正確に理解するのに少し苦労しています。
tag.dll
、、、tag.exp
およびディレクトリに吐き出されたTagLibをコンパイルしましtag.lib
たtaglib
。bindings ディレクトリにもtaglib_c.*
バイナリがありましたが、私はそれらを無視していると仮定しています。
コンパイルされたライブラリを Go で使用するにはどうすればよいですか? OS X のプロジェクトのソースですべてのセットアップを行いましたが、Windows でコンパイルするにはどうすればよいですか? コンパイルされたライブラリ (dll または静的ライブラリ?) は、ソースと同じディレクトリにある必要がありますか? ヘッダーはどうですか?
go - CGo を介してネイティブの Go 型を受け入れる C 関数を定義できますか?
既存のライブラリと統合するために行っている作業では、CGo を介して使用できるインターフェイスを提供するために、いくつかの追加の C コードを作成する必要がありました。
冗長なデータ コピーを避けるために、標準の Go 型 (Go 文字列など) をこれらの C アダプター関数に渡せるようにしたいと考えています。
GoString
エクスポートされた Go 関数で使用するために CGo が生成するヘッダーにとの型が定義されていることがGoInterface
わかりますが、CGo が認識する独自の関数プロトタイプでこれらの型を使用する方法はありますか?
現時点ではvoid *
、C プロトタイプで使用しunsafe.Pointer(&value)
、Go 側を渡すことになりました。ただし、これは私が望むほどきれいではありません (1 つの理由として、これにより C コードに値を書き込む機能が与えられます)。
アップデート:
明確にするために、私は Go のネイティブ文字列型と C の違いを知っていますchar *
。要点は、とにかく C 関数に渡された文字列データをコピーするので、Go 側のコードに独自のコピーを作成させるのは意味がないということです。
また、Go の将来のバージョンでは文字列のレイアウトが変更される可能性があり、そのサイズはプラットフォームによって異なる可能性があることも理解しています。しかし、CGo は既に、現在のプラットフォームに一致する型定義を、_cgo_export.h
それが生成する文書化されたヘッダーを介して私に公開しているので、それが未指定であると話すのは少し奇妙に思えます:
しかし、CGo から見えるプロトタイプでこの定義を使用する方法はないようです。この定義を使用するコードは Go パッケージの一部になるため、バイナリ互換性についてはあまり心配していません。したがって、ソース レベルの互換性で十分です (それがあれば、パッケージを更新することはそれほど大きな問題にはなりません)。そうではありませんでした)。
go - cgoを使用してgoでacライブラリを静的にリンクするにはどうすればよいですか?
したがって、グループには、これを go で実行できることを示唆するものがたくさんあります (ただし、cgo のドキュメントにはありません)。
ただし、うまくいかないようです:
これは動的ライブラリを使用して正常に動作するようで、生成されたファイルを検査すると、実際にはそこに記号「x」が含まれています。
しかし、明らかに bridge.cgo2.o の単なるマーカーです:
私は何を間違っていますか?
ref の場合、c ヘッダー:
そしてコード:
--
編集:
いいえ、-L と -l も機能しません。実際には、これ (-l/blah/blah.a) は cgo では機能しないという特定の議論が google グループで行われています。実際、正しい構文は-l を省略して .a ファイルをリストすることです...しかしねえ、それがうまくいくなら、私は完全にそれを使うだろう. しかし、そうではありません:
詳細バージョン:
このように (-l を使用して) リンクしようとすると失敗するのは、一連のオブジェクト ファイルを結合しようとしているために gcc がリンクに失敗する典型的なものであることに注意してください。
すなわち。これ:
gcc でコンパイルされることはありません。次のように静的ライブラリをリンクする必要があります。
すなわち。-l または -L が欠落しているわけではありません。
linker - cgo CFLAGS コメントで環境変数を使用することは可能ですか?
私は Go 言語用の C バインディングを書き込もうとしていますが、Windows で Cgo コンパイルをセットアップするときに、一種の厄介な状況に遭遇しました。次のようなコードがあります。
これにより、DLL、ライブラリ、およびヘッダー ファイルを C:\Windows ディレクトリに直接インストールすることを回避できますが、他の開発者が別のファイル システム セットアップで作業している場合 (彼らはすべて、ライブラリをC:/dev/extlibs/... 内)。
コード内から環境変数を参照する方法はありますか? おそらく、次のようなものです。
または、私が見逃したこの問題を人々が解決する別の方法はありますか? 私はこの件についてグーグルで時間をかけて調べましたが、有用なものはあまり見たことがありません。