2

これはばかげた質問のように思えるかもしれませんが、C++ などの他の言語から呼び出すことができるライブラリを GO で作成することは可能ですか?

4

2 に答える 2

6

残念ながら、それは直接 ( 「呼び出すことができます」 ) 可能ではありません。プラットフォームの C 実装によって定義されているものに関して、いくつかの問題があります (公式にサポートされているプラ​​ットフォームのほとんど/すべてに対して):

  • 呼び出し規約は同じではありません: たとえば、Go 関数/メソッドは、戻り値 (存在する場合) にレジスタを使用しません。
  • 実行モデルが異なります: 分割スタックが使用されます。
  • ガベージ コレクターは、プロセスによって所有されているが、GC によって「収集不可」または特別にマークされた (正確な収集のために) として「登録」されていないメモリによって混乱する可能性があります。
  • Go ランタイムの初期化が問題です。プロセスの他の何よりも先に行われることを期待しています。複数の Go .so とリンクする場合、初期化を調整するための既製のメカニズムは存在しません。

上記のすべてが「gc」に適用されます。同じことが「gccgo」である程度緩和されています。これについての詳細はC C_Interoperabilityにあります。

于 2013-07-17T11:00:27.763 に答える