2009-12-13 79 views
1

我有一個應用程序正在使用我製作的靜態庫。庫中的一個.cpp文件有一個靜態變量聲明,它的ctor在一個單獨的函數上調用一個函數,添加一個字符串。靜態變量初始化代碼永遠不會被調用

現在,當我從應用程序使用該庫時,我的單例似乎沒有包含應該添加的字符串的任何痕跡。

我確實失去了一些東西,但我不知道是什麼..

回答

5

如果你不是明確標明應用程序中使用靜態庫有一個對象。然後鏈接程序不會將該對象從lib中拖到應用程序中。

靜態和動態庫之間存在很大差異。

動態庫:
在編譯時,動態庫中沒有任何東西被拉出。添加額外的代碼以在運行時顯式加載和解析符號。在運行時,整個庫被加載,因此調用對象初始化器(雖然何時是實現細節)。

靜態庫的處理方式非常不同:
當您針對靜態庫進行鏈接時,它會將應用程序中未定義的所有項目庫中定義的項目拖到應用程序中。重複這個操作,直到庫沒有更多的依賴可以解決。這樣做的副作用是未明確使用的對象/函數不會從庫中拉出(因此不會直接訪問全局變量)。

+0

你釘了它,謝謝。確實沒有明確使用它,但我*認爲*它將保持代碼在調試模式下。 – 2009-12-13 19:14:24

1

我的這種記憶是有點朦朧,但你可能有一個初始化順序問題被擊中。無法保證不同文件中的靜態變量初始值設定項被調用的順序,所以如果你的單例沒有被初始化,當你的庫中的靜態變量被初始化時,這可能會產生你所看到的效果。

我得到解決這些問題的方法是有某種明確的init函數來做這些事情,我在main開頭打電話什麼的。你也許能夠擺脫把對象文件和庫參數賦給編譯器(或者實際上是連接器)的順序,因爲這對我也有效,但是這個解決方案有點脆弱,因爲它不僅取決於使用特定的鏈接器,但也可能是特定的版本。

+0

感謝您的快速回答。這絕對不是訂單問題,因爲我已經對此進行了整理。 init不方便,因爲我想在任意數量的cpp文件中聲明任意數量的這種變量,並且在運行時處理* generated *列表。 – 2009-12-13 18:55:48

0

重構靜態初始化的類,以便它們不依賴於任何其他類。也就是說,讓每個類的初始化都是獨立自足的。

+0

關鍵是,靜態變量只存在(在它們的ctor中)一個靜態函數 - 在一個cpp文件中定義 - 列表中,以便我可以在運行時稍後選擇其中一個。所以在這種情況下,沒有獨立的概念 - 我想。 – 2009-12-13 19:03:37