0

我一直試圖解決這個unresolved external symbol靜態變量現在幾個小時,我在我的智慧'結束。我使用Visual Studio 2010中這裏的情況簡要概況:什麼可能導致此鏈接器錯誤?

項目的問題:

-ProjA (outputs a .dll and .lib) 
-ProjB (outputs a .exe) 

在ProjA,我有這兩個文件:

//foo.h 
#pragma once 

class SUP 
{ 
public: 
    static int staticint; 
}; 

//foo.cpp 
#include "foo.h" 
int SUP::staticint = 10; 

ProjB鏈接到ProjA.lib

//main.cpp 
#include "{Full_Path}foo.h" 
int main(){ 
    std::cout << SUP::staticint << std:: endl; 
} 

現在的main.cpp編譯沒有任何問題,但是當我嘗試生成項目,我得到以下錯誤:

main.obj : error LNK2001: unresolved external symbol "public: static int SUP::staticint" ([email protected]@@2HA)

我幾乎是100%肯定我給自己定正確使用ProjB的選項。在「其他依賴項」下,我擁有「ProjA.lib」,並且在「其他庫目錄」下有我生成ProjA.lib文件的目錄的路徑。

我甚至有ProjA輸出.MAP文件,並在地圖上我發現: 0003:00004458 [email protected]@@2HA 10049458 foo.obj

所以我猜測,這意味着staticint已經正確定義。

什麼可能會出錯?顯然,我做錯了什麼,但是我看不出什麼。我確定ProjB正在鏈接正確的.lib文件。我確定include目錄是好的。我確定靜態變量的定義是合理的。如有必要,我會提供任何其他信息。

+1

可能[相關問題](http://stackoverflow.com/questions/2479784/exporting-static-data-in-a-dll)? – tmpearce

回答

1

在MSVS下,您必須明確聲明要用__declspec(dllexport)導出的符號。

由於SUP位於不同的庫中,因此只有導出的符號可供其他模塊使用,其他模塊必須將其標記爲__declspec(dllimport)

這種雙重行爲通常是通過一個宏實現:

#ifdef EXPORT_MODULE 
#define DLLIMPEXP __declspec(dllexport) 
#else 
#define DLLIMPEXP __declspec(dllimport) 
#endif 

和類聲明爲

class DLLIMPEXP SUP 
{ 
public: 
    static int staticint; 
}; 

其中EXPORT_MODULE在其中出口符號項目定義。

+0

[This](http://social.msdn.microsoft.com/Forums/en/vclanguage/thread/e6badd8c-434a-4c5b-b5c2-1d58f4b5dd81)表明你不能導出數據,只是函數。這有改變嗎? – tmpearce

+0

@tmpearce操作可以測試這個,讓我們知道。對我來說,那個鏈接似乎很奇怪,但是再次它不會是我第一次錯誤:) –

+0

你是對的,這是DLL導出問題。 – Lanaru

相關問題