2016-11-18 49 views
1

共通のベースライブラリにすべてリンクするアプリケーション用のプラグインがあります。基本ライブラリは、各プラグインのすべてのオブジェクトコンストラクタのリストを保持するシングルトンを定義します。共有ライブラリ固有のシングルトンインスタンスを作成する方法

ウィンドウでは、この基本ライブラリを静的ライブラリとして作成できます。したがって、シングルトンのコピーが各プラグインに配置されます。 (原作者ごとに)共有ライブラリとして

  • ビルドベース
  • ビルドベースとして: は、しかし、Linux上で私は、私がこれまでに以下のことを試してみたas this fellow.

    逆の問題のビットを持っています-fPIC

  • -fPICと同様に静的ビルドベースの静的、明示的にCMakeの

に-rdynamic削除私は実際にプログラムを維持したいと思いますシングルトン定義を各プラグインの基本ライブラリの内部に置いて、それ自身のインスタンスを持つようにすることで、これと同じ構造になります。私は各プラグインに定義を移すことを実験しましたが、私はそれを避けたいと思っています。 本質的に私は彼がバグと考えるものを再現したい。しかし、彼は自分のシングルトンを1つのヘッダファイルに完全に定義しています。これは、各プラグインが独自のクラスのインスタンス化を持つことになります。一方、ベースライブラリにコンパイルされたシングルトンの定義があります。

答えて

1

あなたにとって最良の解決策は、Windowsでの作業と同じことです。基本ライブラリをアーカイブ(静的)ライブラリとしてコンパイルし、各プラグインにリンクします。 (これには-fPICでベースライブラリをコンパイルする必要があります)

これがうまくいかなかった理由は、プラグインからエクスポートする機能を制御していないからです。

Windowsでは、明示的にDLLEXPORTプラグインの機能がない限り、プラグインは機能しません。 Linuxでは、のデフォルト値はであり、2つの共有ライブラリが同じシンボルをエクスポートすると、ロードされた最初のシンボルが優先されます。

ので、ここであなたは何をする必要があるかです:

  1. -fPIC -fvisibility=hidden
  2. 付きコンパイルの基本ライブラリを使用すると、は__attribute__((visibility("default")))を追加し、プラグインからエクスポートしたいん特定の機能のために。

これを実行したら、nm -D new-plugin.soを実行し、nm -D old-plugin.soと比較してください。古いプラグインがすべてをエクスポートし、新しいプラグインがエクスポートのためにマークした関数だけをエクスポートすることがわかります。

もう1つの方法は、シンボルの可視性を制御するためにlinker scriptを使用することです。

+0

もう1つの機会は[可視性プラグマを使用する](https://gcc.gnu.org/onlinedocs/gcc/Visibility-Pragmas.html)です。 – yugr

+0

応答していただきありがとうございます、私は数日後にテストし、私がやっていることがうまくいくかどうかを確認します。 –

+0

これは私がやりたいことがうまくいくことを実証し、検証しました。どうもありがとうございます。 –

関連する問題