Tag: 插件

C pluginsystem:符号查找错误

我正在编写一个插件系统,它与其他3个模块分开: plugin_system.c – 系统的核心 list.c – 包含插件存储的链接列表实现 plugin_interface.h – 包含插件所需的声明,没有与之关联的源文件 plugin_interface.h只包含类型和函数: extern int plugin_register(PluginManager *plug_manager, const char *name, Plugin *plug); 这是在plugin_system.c中定义的 加载插件时,插件系统会查找函数init_plugname()并调用它,该函数必须调用plugin_register来注册插件。 该程序使用复杂的递归Makefile编译(不是最好的主意),但我尝试实现的是: 我在主程序文件夹中编译插件系统对象,然后将其与主程序链接。 从make执行: gcc -Wall -O2 -std=gnu99 -D DEBUG -g -fPIC -c -o /home/kowa/code/reseaux/projet/ringo/c/bin/list.o list.c gcc -Wall -O2 -std=gnu99 -D DEBUG -g -fPIC -c -o /home/kowa/code/reseaux/projet/ringo/c/bin/plugin_system.o plugin_system.c 插件使用gcc -fPIC -c -o plugname.o plugname.c […]

如何通过SWIG创建已包装库的扩展?

我有一个图书馆。 它是通过SWIG封装的。 我想创建一个插件来扩展它。 插件需要一个来自已经包装的库的类来运行类似void init( oldT old); 。 库使用Java和c#。 现在这个插件也将从那里使用。 库和插件是单独的dll。 如何在为插件创建绑定时已经拥有oldT类型的SWIG?

如何阻止延迟加载的DLL抛出“从计算机中丢失”系统错误?

我昨天在插件中设置了延迟加载: #ifdef _WIN32 #pragma warning (disable : 4100) /* Disable Unreferenced parameter warning */ #include #include #endif … // Configuration Properties / Linker / Input / Additional Dependencies: ./lib/libcurl.lib;./lib/libxml2.lib;./lib/iconv.lib;./lib/zlib1.lib;%(AdditionalDependencies) // Configuration Properties / Linker / Input /Delay Loaded Dlls: libcurl;libxml2;iconv;zlib1;%(DelayLoadDLLs) #include “curl.h” #include “HTMLparser.h” #include “xpath.h” #ifdef _WIN32 #pragma comment(lib, “libcurl”) #pragma comment(lib, “iconv”) #pragma […]

为什么我应该用c ++而不是c来设置插件接口

由于我之前的 问题,我问自己:为插件系统设置C ++接口是否有用? 以下几点是针对它的: 不同编译器及其版本之间没有共同的ABI,内存中没有对象的共同布局 没有直接的类出口。 你必须出口工厂和析构工具。 如果您的对象由仅delete它们的其他对象(例如智能指针)保持,则会出现问题。 STL的不同实现,你不能将std::list传递给插件 Boost使用的库的不同版本 如果你克制自己的C ++语言的其余部分,你几乎最终得到“C子集”。 有没有关于使用C ++的观点? Qt-Toolkit如何解决上述问题? 备注:我主要指的是Linux系统。 不过我对其他平台上的解决方案感兴趣。 其他问题:使用C接口有什么问题? struct s的内存布局? 应该避免C的哪些语言部分?

使用libdl在C中的插件架构

我一直在玩弄,在C中编写一个小型IRC框架,我现在将扩展其中一些核心function – 但除此之外,我希望它可以通过插件进行扩展! 到目前为止,每当我写一些IRC相关的东西(我写了很多东西,现在大约有6种不同的语言……我很着火!)并且实际上继续实现了一个插件架构,它是在一种解释性的语言中有设施(读:滥用)所以,就像在Ruby中干扰整个脚本文件一样(糟糕!)。 现在我想在C中滥用一些东西! 基本上我可以做三件事 在我的程序中定义一个简单的脚本语言 使用现有的,嵌入一个解释器 使用libdl在运行时加载* .so模块 我喜欢第三个,如果可能的话,请避开其他两个选项。 也许我是某种forms的受虐狂,但我认为这对于学习目的来说既有趣又有用。 逻辑思考,明显的“痛苦链”将是(从最低到最高)2 – > 1 – > 3,原因很简单,因为libdl正在处理原始代码,这些代码可能(并且将会)在我的脸上爆炸。 所以这个问题告诉你,stackoverflow的其他用户,你认为libdl能胜任这个任务,甚至是一个现实的想法吗?

在沙箱中运行插件

我正在设计一个C / C ++系统,它可以通过各种插件进行扩展。 有一个定义良好的C公共API,它主要使用(const) char*和其他指针类型。 插件被编译成.so或.dll文件,主应用程序在启动时加载它们,然后根据请求卸载或重新加载它们。 插件可能来自各种来源,可靠或不可信:) 现在,我想确保,如果一个插件做了一些愚蠢的事情(比如尝试释放他本不应该释放的内存),这个动作并没有打倒整个系统,而只是注意到主系统它的行为不端插件,以便从队列中删除它。 代码调用以下列方式完成: const char* data = get_my_data(); for(int i = 0; iexecute(data); } 但如果plugin[0] “意外”释放数据字符串或覆盖它或错误地跳转到地址0x0这将导致整个系统崩溃,我不希望这样。 我怎样才能避免这种灾难。 (我知道,我可以复制data字符串……这不能解决我的问题:))

将复杂数据类型从纯c插件传递到Unity C#脚本

我目前正在为Objective-C中的Unity编写一个In-App购买插件,使用纯C作为Unity和objective-c代码之间的API。 介绍我面临的问题 基本function已经有效。 也就是说,我已经在我的插件中有一个非常基本的函数调用来启动对Apple App Store的产品请求,可以从Unity调用。 在Unity脚本中,您只需将此方法称为: [DllImport (“__Internal”)] private static extern void RequestProducts(string[] productIdentifiers, int arrayCount); public static void RequestProductData( string[] productIdentifiers ) { RequestProducts(productIdentifiers, productIdentifiers.Length); } 这会调用C函数,如下所示: void RequestProducts(char* productIdentifiers[], int arrayCount) { // Call the In-App purchase manager to initialize the product request [[InAppPurchaseManager sharedInAppPurchaseManager] RequestProductData:productIdentifierCollection]; } 现在我省略了C函数的一部分,它接受了productIdentifiers数组并将其转换为NSArray,只是为了保持简单并解释我试图解决的问题。 现在InAppPurchaseManager类是一个单例类。 RequestProductData方法向app store发起产品请求。 问题 […]

返回共享库符号表

例如: void* sdl_library = dlopen(“libSDL.so”, RTLD_LAZY); void* initializer = dlsym(sdl_library,”SDL_Init”); 假设没有错误,初始化程序将指向共享库libSDK.so中的函数SD_Init。 但是,这需要知道符号“SDL_Init”存在。 是否可能在库中查询其所有符号? 例如,在这种情况下,它将返回SDL_Init,函数指针以及libSDL.so导出的任何其他符号。

编写插件系统?

经过几个小时的研究,我什么都没有,所以我向你们求助于希望找到解决方案的好人。 我将用c ++编写一个bot,并且在某些时候想为它创建一个插件系统。 现在我知道我可以为它编写脚本语言,但是,我知道可以只编写一个api并在运行时动态地将程序链接到该API。 我的问题是,我如何获得动态链接(就像hexchat的插件一样)? 是否有任何优雅的解决方案,或者至少是典型设计的理论?

插件系统如何工作?

我正在开发一个项目,我会发现一个基本的插件系统很有用。 本质上,我创建了基类,并可以为插件开发人员提供此基类。 然后开发人员覆盖它并覆盖方法。 然后这就是我对它有点不清楚的地方。 它是如何工作的? 我在哪里可以找到有关这类系统开发的文档? 谢谢