2012-09-25 96 views
1

我在headerfile XH定義的一類DLL-1,其是導出一個靜態函數


class A{ 
    public: 
    static int val; 
__declspec(dllexport) static void setval(int v) {val = v;} 
}; 

和x.cpp具有


int A::val = 256; 

現在我建立了dll-1並通過它,但其他DLL鏈接此DLL未能建立與錯誤未解決的外部符號public:static int A :: val。當我在x.cpp中定義導出的函數時,這已經解決了。但我不明白爲什麼它壞了。謝謝。

+0

[導出DLL中的靜態數據]的可能的重複(http://stackoverflow.com/questions/2479784/exporting-static-data-in-a-dll) –

+0

你得到了[編譯器警告(級別1) C4251(http://msdn.microsoft.com/en-us/library/esew7y1w.aspx)?該頁面非常明顯地提到_'所有的靜態數據都是通過從DLL'_導出的函數進行訪問的。將來,你會希望[包括編譯器錯誤(就像我之前提到的,順便說一下)](http://chat.stackoverflow.com/transcript/10?m=5507868#5507868)。 – sehe

回答

3

因爲你定義了函數內聯,所以編譯器可以自由地在你調用它的地方創建一個函數的副本。這些副本無法看到變量,因爲它沒有被導出。

將函數定義移動到.cpp時,所有調用都會返回到DLL,這可能會在創建DLL時解析該變量。

+0

這聽起來是正確的。我不能完全明白這一點。 +1 – sehe