我花了几天的时间阅读并反复阅读有关主题的所有教程,并在SO上浏览相关问题数小时(甚至数天),但我仍然不能让以下内容正常工作。如有重复,请谅解:很可能我已经看到和重读了许多次重复的问题,但无法理解答案与我的问题的相关性。有了这个前提...
我正在尝试为我的应用程序实现一个插件架构。插件被编译并安装为库。运行时,应用程序然后使用dlopen() / dlsym()来加载和链接到插件的函数。
想法是插件(库)将实现一组函数,以返回数据到主应用程序,或操纵从应用程序传递的数据。
为了测试这个想法,我尝试实现一个函数(在插件内部),该函数将返回插件本身的(可读)名称(作为std :: string)。我认为那是一个简单的开始.... :-/
以下是我目前得到的内容:
我知道我已经接近成功了:代码编译通过,应用程序也停止崩溃了;) 但是,我期望看到实际的插件名称却出现了空白。
到目前为止,我阅读的所有教程都非常快速地介绍了数据双向传递的机制:插件<=>应用程序。对于我想要使用“简单”的std::string实现的功能,我希望以后可以使用更复杂的对象(即插件函数将通过引用获取对象并更改其属性)。这些教程或多或少都在使用dlsym()创建指针的时候就停止了,并没有给出如何使用该指针的示例。
那么,如何做到这一点呢?
另一个相关的问题:我是否使用通用头文件,既可以与应用程序一起使用,也可以与插件一起使用,并在其中定义函数调用签名?我该如何做到这一点,这样做有什么好处?
我正在尝试为我的应用程序实现一个插件架构。插件被编译并安装为库。运行时,应用程序然后使用dlopen() / dlsym()来加载和链接到插件的函数。
想法是插件(库)将实现一组函数,以返回数据到主应用程序,或操纵从应用程序传递的数据。
为了测试这个想法,我尝试实现一个函数(在插件内部),该函数将返回插件本身的(可读)名称(作为std :: string)。我认为那是一个简单的开始.... :-/
以下是我目前得到的内容:
// Plugin.cpp
extern "C" void plugin_name(std::string *name) {
name = new std::string("Example plugin name");
}
// Application.cpp
void* handle = dlopen("libplugin.so", RTLD_LAZY);
typedef void (*plugin_t)(std::string*);
dlerror(); // Reset errors.
plugin_t call_plugin_name = (plugin_t) dlsym(handle, "plugin_name");
// ... Some error handling code.
std::string my_plugin_name;
call_plugin_name(&my_plugin_name);
dlclose(handle);
// More code that displays my_plugin_name.
我尝试了许多不同的组合,包括一种看起来更直接(但效果并不更好)的方法,其中返回插件名称:
// Plugin.cpp
extern "C" std::string plugin_name(void) {
return std::string("Example plugin name");
}
我知道我已经接近成功了:代码编译通过,应用程序也停止崩溃了;) 但是,我期望看到实际的插件名称却出现了空白。
到目前为止,我阅读的所有教程都非常快速地介绍了数据双向传递的机制:插件<=>应用程序。对于我想要使用“简单”的std::string实现的功能,我希望以后可以使用更复杂的对象(即插件函数将通过引用获取对象并更改其属性)。这些教程或多或少都在使用dlsym()创建指针的时候就停止了,并没有给出如何使用该指针的示例。
那么,如何做到这一点呢?
另一个相关的问题:我是否使用通用头文件,既可以与应用程序一起使用,也可以与插件一起使用,并在其中定义函数调用签名?我该如何做到这一点,这样做有什么好处?
char*
让它正常工作? - genpfault