从DLL导出全局变量

Gil*_*ili 20 c++ dll dllimport visual-studio

我正在尝试从DLL导出全局变量.

foo.h中

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

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

API const Foo foo;
Run Code Online (Sandbox Code Playgroud)

Foo.cpp中

#include "Foo.h"

const Foo foo;
Run Code Online (Sandbox Code Playgroud)

当我编译上面的代码时,Visual Studio抱怨:

foo.cpp(3):错误C2370:'foo':重新定义; 不同的存储类1> foo.h(14):看'foo'的声明

如果我使用:

external const Foo foo;
Run Code Online (Sandbox Code Playgroud)

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

Com*_*ger 28

在你的标题中:

API extern const Foo foo;
Run Code Online (Sandbox Code Playgroud)

在您的源文件中:

API const Foo foo;
Run Code Online (Sandbox Code Playgroud)

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

  • 如果我错了,请纠正我.使用带有C编译器的__declspec(dllexport)(来自MINGW的gcc)将自动为变量添加"extern"关键字,而使用C++编译器(来自MINGW的g ++)则情况并非如此,并且您已明确使用"extern". (2认同)