1

私の次のシナリオでは:

  • libA.so ライブラリ リンク libCommon.so
  • libB.so ライブラリも libCommon.so にリンクしています
  • 両方のライブラリが同じ libCommon.so をリンクしているにもかかわらず、libCommon.so の異なる構成をセットアップします。

             --> libA.so --> libCommon.so
            /
    ProgramA
            \
             --> libB.so --> libCommon.so
    
    
    
             --> libA.so
            /           \
    ProgramA              --> libCommon.so
            \           /
             --> libB.so
    

私のプログラムは libCommon.so の同じコピーを共有しますか、それとも別のコピーを使用しますか? 前述したように、libCommon.so は別の設定で使用されます。理想的には、最初の図のように、libCommon.so がメモリ内に異なるコピーを持つようにしたいと考えています。あるコピーへの呼び出しが反対側の動作に影響するのを避けようとしています。

4

1 に答える 1

1

簡単な答え: 2 番目の図が表示されます。そして、それは通常、ほとんどの開発者が望んでいることです。そうでなければ、動的リンクのメリットは少なくなります。同じプロセス内で複数のインスタンス化を許可するかどうかは、実際には libCommon の実装次第です。通常は、エクスポートされた関数呼び出し間で状態を維持するためにライブラリ内のグローバル変数を回避することによって実現されます。

libCommon のソースを維持していますか? その場合は、グローバルですべての状態を維持するのではなく、「セッション」に基づいて使用するように修正する方法を検討してください。

そうでない場合、ソースを libA または libB に維持しますか? libCommon.so の代わりに libCommon.a に静的にリンクする libA と libB の一方または両方を持つことにより、基本的に最初の図を取得できます。これは、libCommon.a の静的にコンパイルされたバージョンが存在することを前提としています。

于 2013-03-10T04:20:16.037 に答える