共有ライブラリが公開するAPIは、ホストアプリケーションが期待するのと同じABIを使用する必要があります。つまり、関連するタイプは同じレイアウト、サイズ、配置でなければなりません。
APIに公開されているタイプがstd::
の場合、またはC++の例外がスローされる場合は、同じ標準ライブラリのヘッダーとマクロを使用して共有ライブラリをコンパイルする必要があります。この場合、ホストアプリケーションに付属のlibstdc++
に動的にリンクすることができます。
APIに公開されているstd::
タイプがなく、共有ライブラリから例外がスローされない場合は、静的にlibstdc++
にリンクできます。しかし、すべての外部シンボルは共有ライブラリから引き続き公開されるため、RTLD_DEEPBIND
フラグを持たないdlopen
への呼び出しがロードされると、ホストアプリケーションから同じ名前のシンボルが使用されますあなたが静的にリンクすることを望んでいたもので、あなたの友人がおそらく参照しているその未定義の動作を引き起こす可能性があります。これを避けるには、共有ライブラリのすべてのシンボルをローカルにし、APIシンボルのみをグローバルとして公開するためにリンカバージョンのスクリプトが必要です。
MYHALFLIFEPLUGIN_0.0 {
global: half_life_foo,half_life_bar; # Explicitly list symbols to be exported.
local: *; # Hide everything else.
};
そして-Wl,--version-script=<filename>
コンパイラリンカオプション(LDFLAGS
)で、このスクリプトを使用するようにリンカに指示:ような何か。 -static-libstdc++
オプションに加えて、-static-libgcc
リンカオプションが必要です。
はまた、より多くの詳細については、
一読を持っています。
この回答を書いていただきありがとうございます。あなたは私には分かりませんでした。私はちょっと待って答えを受け入れます。 – Inline
@Inline私は何かを見逃しているかもしれません。 'ldd'と' nm'はあなたの親友です:あなたの共有ライブラリが予期しない何かをリンクしていないことを確認してください。 –