2010-06-22 77 views
16

全局變量我想一個全局變量從DLL導出。導出從DLL

foo.h中

class Foo 
{ 
public: 
    Foo() 
    {} 
}; 

#ifdef PROJECT_EXPORTS 
    #define API __declspec(dllexport) 
#else 
    #define API __declspec(dllimport) 
#endif 

API const Foo foo; 

Foo.cpp中

#include "Foo.h" 

const Foo foo; 

當我編譯上述代碼時,Visual Studio抱怨:

Foo.cpp中(3):錯誤C2370:' foo':重新定義;不同的存儲類 1> foo.h中(14):看到「富」

的聲明如果我使用:

external const Foo foo; 

foo.h中的編譯器是高興,但隨後該DLL不導出符號。我已經設法導出帶有問題的函數,但變量似乎不以同樣的方式工作......任何想法?

+1

爲什麼-1?請證明你的失望。 – Gili 2012-02-10 20:47:02

回答

24

在您的標題:

API extern const Foo foo; 

在源文件:

API const Foo foo; 

如果沒有extern關鍵字,你的C編譯器假定你的意思是聲明一個局部變量。 (它不關心你碰巧有包括來自頭文件的定義。)你還需要告訴你在導出的變量時,你實際上是在源文件中聲明它打算編譯器。

+0

這樣做。謝謝! – Gili 2010-06-23 00:01:08

+0

請糾正我,如果我錯了。使用__declspec(dllexport)的用C語言編譯器(從MINGW GCC)會自動添加變量「外部」的關鍵字,而用C++編譯器(G ++從MINGW),這是不是這樣的,你已經明確地使用「外部」。 – meolic 2013-01-11 12:08:44

0

Foo最有可能在現實生活中的成員函數,調用這些從另一個模塊將導致鏈接錯誤與OP /接受的答案。該類必須爲了使用它的出口實例該模塊之外,以消除鏈接錯誤,以及被定義爲DLL導出/導入。

class API Foo 
{ 
public: 
    Foo() 
    {} 
    void DoSomeWork(); // calling this would cause link error if Foo is not defined as import/export class 
}; 

隨着中說,它可能會更好的東西,如DLLEXPORT重命名#define API,因此它是有道理的兩個API和出口類。