从DLL导出全局变量

时间:2010-06-22 22:16:12

标签: c++ visual-studio dll dllimport

我正在尝试从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 GT; foo.h(14):见'foo'的声明

如果我使用:

external const Foo foo;
在Foo.h中

编译器很高兴,但DLL不会导出符号。我设法导出有问题的函数,但变量似乎没有相同的方式...任何想法?

2 个答案:

答案 0 :(得分:28)

在标题中:

API extern const Foo foo;

在您的源文件中:

API const Foo foo;

如果您没有extern关键字,您的C编译器会假定您要声明一个局部变量。 (它并不关心您是否恰好包含了头文件中的定义。)当您在源文件中实际声明变量时,您还需要告诉编译器您计划导出变量。

答案 1 :(得分:1)

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和导出类都有意义。