首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >__declspec(dllimport)和extern (Extern)

__declspec(dllimport)和extern (Extern)
EN

Stack Overflow用户
提问于 2016-06-10 01:08:01
回答 1查看 478关注 0票数 1

我正在通过OBS源代码来了解他们是如何做插件系统的。我被困在一个我无法复制的部分上,我在任何地方都找不到答案。

为了与OBS加载的插件(dll)共享函数,有一个指向APIInterface的指针。这个指针名为API,所以从现在起我会这样称呼它。此变量在OBSApi\APIInterface.h中声明,声明为:BASE_EXPORT extern APIInterface *API;,其中BASE_EXPORTOBSApi\Utility\XT_Windows.h中定义为

代码语言:javascript
复制
#if defined(NO_IMPORT)
    #define BASE_EXPORT
#elif !defined(BASE_EXPORTING)
    #define BASE_EXPORT     __declspec(dllimport)
#else
    #define BASE_EXPORT     __declspec(dllexport)
#endif

最后,在OBS对象的构造函数(在主程序中)中,它用API = CreateOBSApiInterface();初始化API

但是,如果存在一个只声明&而不是初始化的变量,则无法编译。所以,我想知道我缺少了什么,如何在插件之间共享这个API变量?

谢谢你的回答。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-10 01:19:31

在这种情况下,插件所做的是使用一个全局变量,该变量使用__declspec(dllexport)从插件导出到程序中。

在您的程序中,它使用__declspec(dllimport)导入。

变量本身是在插件中定义的,extern告诉您的程序在当前编译单元中找不到声明,所以当链接器开始查找它时会找到它。

以下是这方面的一个小例子:

plugin.h

代码语言:javascript
复制
/* define the int* as an exported external. */
BASE_EXPORT extern int* exportedInt;

plugin.c

代码语言:javascript
复制
#define BASE_EXPORTING /* so the macro shown will export. */
#include "plugin.h"

/* actually define the int* so it exists for the linker to find. */
int* exportedInt = NULL;

your_program.c

代码语言:javascript
复制
#include "plugin.h"

/* use the int* in your program, the linker will find it in plugin.cpp. */
exportedInt = CreateIntPointerFunction();

然后可以将插件编译为静态(.lib)或动态(.lib.dll)库,然后您可以将其链接到代码中。

使用动态库,您可以选择:

  • 在运行时动态加载它,不需要.lib,但是您需要手动查找值和入口点。
  • 使用.lib.dll组合在编译时链接它,这将自动告诉程序在哪里找到所有的入口点和值。

只要在编译单元中包含头文件,并告诉链接器在不执行运行时加载时在哪里找到.lib,您就可以在自己的程序中使用导出的函数和变量。

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

https://stackoverflow.com/questions/37738496

复制
相关文章

相似问题

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