2017-05-04 57 views
0

我遇到了一些情況,其中一些依賴代碼是一個靜態庫。靜態或全局通過鏈接的多個實例

我們稱之爲靜態庫「A」。 我做了一個DLL「B」,它鏈接到「A」。 可執行文件「C」鏈接到兩者。

I think this diagram is correct: 

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

「A」包含使用全局變量的記錄器類。這是你公司的一個手,你看着它,並對自己說:「哦,廢話什麼爛攤子。」

看來,「A」中的這些全局變量具有不同的地址,具體取決於我是在單步執行可執行模塊中的代碼還是單步執行dll模塊中的代碼。

這當然會使記錄器以意想不到的方式工作。

我假設靜態庫被複制一次到dll中,一次進入可執行文件,因此實際上是所有靜態和全局變量的2個副本。那是對的嗎?

問題的第二部分是,將使該記錄器成爲Meyer的單例解決問題,還是將靜態方法範圍內的不同地址也取決於我調用哪個模塊?

或者,是正確的做法,使所有50個項目動態鏈接,如果一個動態鏈接?

+0

@descherjm是的。它們都是Visual Studio 2015中相同解決方案的一部分。該解決方案有一個可執行文件,所有文件都鏈接到該文件中。 –

+0

你可以把全局變量放在一個dll中嗎? – drescherjm

+0

@dresherjm沒有任何時間我的上司會滿意。 –

回答

3

每個可記錄的可執行文件當前必須鏈接到靜態庫中。請注意,DLL在這裏被認爲是可執行文件。

因此,你的DLL和你的EXE都有自己的副本,表示靜態庫,有自己的變量等等。唯一真正的辦法是將日誌記錄從靜態庫移動到DLL,或者使其一次記錄多個實例以有用和預期的方式工作。

+0

你相信梅耶的模式會有同樣的不良行爲?即在方法範圍的靜態方面呢? –

+0

是的。你可以通過實例化一個單例COM對象來解決它(然後它可以被正確共享),但這不僅僅是做一個日誌DLL。 – Donnie