__declspec(dllimport)和extern(OBS)

时间:2016-06-10 01:08:02

标签: c plugins dllimport extern dllexport

我正在浏览OBS来源,了解他们是如何使用插件系统的。我被困在一个我无法复制的部分,而且我在任何地方都找不到答案。

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

#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初始化API = CreateOBSApiInterface();

但是,如果有一个我只声明的变量,我就无法编译。没有初始化。所以,我想知道我错过了什么,这个API变量如何在插件之间共享?

感谢您的回答。

1 个答案:

答案 0 :(得分:1)

插件在这种情况下的作用是使用从插件中使用__declspec(dllexport)导出到程序中的全局变量。
在您的程序中,它是使用__declspec(dllimport)导入的。

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

这看起来如下的一个小例子如下:

plugin.h

/* define the int* as an exported external. */
BASE_EXPORT extern int* exportedInt;

plugin.c

#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

#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,您就可以使用导出的函数和变量了。自己的计划。