我們有一個由許多個人C++項目組成的產品 - 直到最近它們都是DLL項目(除了可執行文件之外)。如何重構現在駐留在靜態庫中的全局記錄器?
有些項目從來沒有真正改變,我們認爲我們可以降低我們的一天到一天的解決方案消除這些項目的一些開銷開發者的承擔。然後他們被改爲構建靜態庫,並且我們可以向devs提供.libs以鏈接(以及PDB等)。
但是,在這個過程中,我們打破了我們的記錄器 - 現在生活在這些靜態庫之一中。它被聲明爲一個全局變量,我們現在有許多實例被創建,而不是像之前一樣(當它駐留在一個DLL項目中時)。有很多實例的主要問題是可執行項目通常會設置文件名 - 因此文件名只能設置爲與可執行項目關聯的實例,而不是記錄器的所有其他實例(例如,登錄其他項目不會反映在日誌文件中)。
我明白爲什麼會發生這種情況,但有興趣從這裏獲得有關最佳方法的建議。
我相信最簡單的辦法就是簡單地將該特定項目恢復爲DLL項目。但是,我不希望這樣做,因爲該項目也包含其他內容。
我們可以將記錄器移動到一個新的DLL項目中 - 這樣做相當微不足道,但我不禁感到有一個「更好」的解決方案(我想總是有:P)。
在代碼方面,我們改變之前的記錄被宣佈爲一個CPP如下:
static FileLogger m_fileLogger;
頭(包含在所有其他項目的PCH)具有使用全局函數宏與m_fileLogger進行交互。
我不知道爲什麼它被宣佈靜態。
我試過externing它在頭文件中,但是這並沒有改變行爲(如預料的那樣,給定了在記錄器項目中靜態鏈接的DLL項目)。
你很可能也打造出的DLL那些永遠不變的項目,並sitribute那些(照顧所有開發者使用相同的CRT版本) – stijn