我正在通过OBS源代码来了解他们是如何做插件系统的。我被困在一个我无法复制的部分上,我在任何地方都找不到答案。
为了与OBS加载的插件(dll)共享函数,有一个指向APIInterface的指针。这个指针名为API,所以从现在起我会这样称呼它。此变量在OBSApi\APIInterface.h中声明,声明为:BASE_EXPORT extern APIInterface *API;,其中BASE_EXPORT在OBSApi\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 = CreateOBSApiInterface();初始化API。
但是,如果存在一个只声明&而不是初始化的变量,则无法编译。所以,我想知道我缺少了什么,如何在插件之间共享这个API变量?
谢谢你的回答。
发布于 2016-06-10 01:19:31
在这种情况下,插件所做的是使用一个全局变量,该变量使用__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,您就可以在自己的程序中使用导出的函数和变量。
https://stackoverflow.com/questions/37738496
复制相似问题