首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从DLL导出全局变量

从DLL导出全局变量
EN

Stack Overflow用户
提问于 2010-06-23 06:16:12
回答 2查看 28.9K关注 0票数 27

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

Foo.h

代码语言:javascript
运行
复制
class Foo
{
public:
    Foo()
    {}
};

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

API const Foo foo;

Foo.cpp

代码语言:javascript
运行
复制
#include "Foo.h"

const Foo foo;

当我编译上面的代码时,Visual Studio报告:

foo.cpp(3):错误C2370:'foo‘:重定义;不同的存储类1> foo.h(14):请参见'foo’的声明

如果我使用:

代码语言:javascript
运行
复制
external const Foo foo;

在Foo.h中,编译器很高兴,但是DLL不会导出符号。我设法导出了有问题的函数,但变量似乎不是以同样的方式工作……有什么想法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-06-23 06:38:14

在您的标题中:

代码语言:javascript
运行
复制
API extern const Foo foo;

在源文件中:

代码语言:javascript
运行
复制
API const Foo foo;

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

票数 34
EN

Stack Overflow用户

发布于 2017-10-06 03:10:31

Foo实际上很可能会有成员函数,从另一个模块调用这些函数会导致链接器错误,并返回OP/accepted答案。该类还必须定义为dll导出/导入,以便在此模块外部使用它的导出实例来消除链接错误。

代码语言:javascript
运行
复制
class API Foo
{
public:
    Foo()
    {}
    void DoSomeWork(); // calling this would cause link error if Foo is not defined as import/export class
};

也就是说,最好将#define API重命名为DLLEXPORT,这样对API和导出类都有意义。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3097548

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档