2016-11-01 31 views
1

我們有一個由許多個人C++項目組成的產品 - 直到最近它們都是DLL項目(除了可執行文件之外)。如何重構現在駐留在靜態庫中的全局記錄器?

有些項目從來沒有真正改變,我們認爲我們可以降低我們的一天到一天的解決方案消除這些項目的一些開銷開發者的承擔。然後他們被改爲構建靜態庫,並且我們可以向devs提供.libs以鏈接(以及PDB等)。

但是,在這個過程中,我們打破了我們的記錄器 - 現在生活在這些靜態庫之一中。它被聲明爲一個全局變量,我們現在有許多實例被創建,而不是像之前一樣(當它駐留在一個DLL項目中時)。有很多實例的主要問題是可執行項目通常會設置文件名 - 因此文件名只能設置爲與可執行項目關聯的實例,而不是記錄器的所有其他實例(例如,登錄其他項目不會反映在日誌文件中)。

我明白爲什麼會發生這種情況,但有興趣從這裏獲得有關最佳方法的建議。

我相信最簡單的辦法就是簡單地將該特定項目恢復爲DLL項目。但是,我不希望這樣做,因爲該項目也包含其他內容。

我們可以將記錄器移動到一個新的DLL項目中 - 這樣做相當微不足道,但我不禁感到有一個「更好」的解決方案(我想總是有:P)。

在代碼方面,我們改變之前的記錄被宣佈爲一個CPP如下:

static FileLogger m_fileLogger; 

頭(包含在所有其他項目的PCH)具有使用全局函數宏與m_fileLogger進行交互。

我不知道爲什麼它被宣佈靜態

我試過externing它在頭文件中,但是這並沒有改變行爲(如預料的那樣,給定了在記錄器項目中靜態鏈接的DLL項目)。

+0

你很可能也打造出的DLL那些永遠不變的項目,並sitribute那些(照顧所有開發者使用相同的CRT版本) – stijn

回答

0

問題是每個dll會加載tge靜態庫,因此代碼是dublicates多次。包括您的記錄器。請記住,靜態庫只是.obj文件的集合。

唯一的解決辦法是任何因素共同的代碼放到一個共同的DLL和使用,在整個但icluding不止一次的靜態庫更是極其浪費,並導致你與全局變量描繪這一問題。

當一個DLL的所有代碼和靜態數據被加載到自己的頁面。沒有嘗試重複刪除相同的代碼,即使它來自相同的.lib。

當談到靜態(全局)數據時,每個DLL都會保存自己的設置。唯一的解決方案是在一個共同的DLL中有一個副本。否則你會有問題。

+0

正如我所說的 - 我明白爲什麼這個問題正在發生的事情。你是說多個項目鏈接到一個靜態庫是浪費?你能詳細說明嗎? – grae22

+0

我已經擴展回答。希望它有幫助 – doron

+0

感謝@doron,採用這種方法我將記錄器移動到一個新的DLL項目中(這個項目中的其他內容不需要在一個DLL中)。如果其他人可以提出一種不同的方法,我會把這個問題延長一段時間。 – grae22

相關問題