2017-05-04 3 views
0

私はいくつかの依存関係コードが静的ライブラリである状況に遭遇しました。スタティックまたはグローバルスルーの複数のインスタンス

スタティックライブラリ "A"としましょう。 私はdll "B"を作っており、それは "A"にリンクしています。 実行可能ファイル "C"は両方にリンクしています。

I think this diagram is correct: 

      A static lib 
     /\ 
      | B dll 
      \ \ 
      \---C executable 

"A"には、グローバル変数を使用するロガークラスが含まれています。それは、あなたの会社があなたに手を差し伸べるものの1つで、あなたはそれを見て、自分自身に、「ああ、何を混乱させるの?」と言います。

"A"のグローバル変数は、実行可能モジュールのコードをステップ実行しているのか、dllモジュールのコードをステップ実行しているのかによって、アドレスが異なります。

これはもちろん、予期しない方法でロガーを動作させます。

私は静的ライブラリがdllに一度コピーされ、実行可能ファイルにコピーされたと仮定しているので、実際にはすべての静的およびグローバルのコピーが2つあります。あれは正しいですか?

質問の2番目の部分は、このロガーをMeyerのシングルトンで問題を解決させるか、メソッドスコープ内の静的にも、どのモジュールから呼び出したかによって異なるアドレスを持つことになりますか?

また、動的にリンクする場合、いくつかのプロジェクトをすべて動的にリンクさせることは適切ですか?

+0

@descherjmはい。それらはすべてVisual Studio 2015の同じソリューションの一部です。ソリューションには、すべてがリンクされている実行可能ファイルが1つあります。 –

+0

グローバル変数をdllに入れることはできますか? – drescherjm

+0

@dresherjm私の上司が満足する時間はありません。 –

答えて

3

ログは、現在スタティックライブラリにリンクされている必要があります。ここでDLLは実行可能ファイルとみなされます。

したがって、DLLとEXEの両方に、独自の変数などを持つ静的ライブラリの独自のコピーがあります。唯一の本当の頼みは、スタティックライブラリからDLLへのロギングを移動すること、または一度に複数のインスタンスをロギングすることが有用で期待される方法で動作するようにすることです。

+0

Meyerのパターンは同じ望ましくない振る舞いをすると思いますか?つまり、メソッドスコープでの統計はどうですか? –

+0

はい。シングルトンのCOMオブジェクトをインスタンス化することで回避できます(正しく共有できる可能性があります)。しかし、単にロギングDLLを作成するよりも簡単です。 – Donnie

関連する問題