gpt4 book ai didi

c++ - dynamic_cast 由 lt_dlopen(libtool) 加载的共享库中的接口(interface)不起作用

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:36:32 25 4
gpt4 key购买 nike

这是关于我程序中的插件特性。我需要一个插件中的 C++ 类(和对象),主模块可以通过接口(interface)使用它。接口(interface)继承是这样的:

typedef struct _rwd_plugin_root_t RWD_PLUGIN_ROOT_T;

struct RWD_PLUGIN_API _rwd_plugin_root_t
{
virtual int add_ref() = 0;
virtual int release() = 0;
};

typedef struct _rwd_plugin_base_t RWD_PLUGIN_BASE_T;

struct RWD_PLUGIN_API _rwd_plugin_base_t : _rwd_plugin_root_t
{
virtual RWD_PLUGIN_TYPE_T get_plugin_type() = 0;
virtual const char * get_plugin_label_a() = 0;
virtual const wchar_t * get_plugin_label_w() = 0;
};

typedef struct _rwd_autocomplete_plugin_base_t RWD_AUTOCOMPLETE_PLUGIN_BASE_T;

struct RWD_PLUGIN_API _rwd_autocomplete_plugin_base_t : _rwd_plugin_base_t
{
virtual int set_proxy(int type, const char * host, long port) = 0;
virtual int set_term(const char * text) = 0;
virtual int set_term(const wchar_t * text) = 0;
virtual int get_phon(std::vector<std::string> & phons) = 0;
... // omitted it's too long
};

然后我在插件中有一个类来实现这样的接口(interface):

class RWD_PLUGIN_API _rwd_dictcn_t : public _rwd_autocomplete_plugin_base_t
{
public:
_rwd_dictcn_t();
~_rwd_dictcn_t();
... // details of implementation omitted

插件中的创建者是这样定义的:

EXTERN_C int RWD_PLUGIN_API create_rwd_plugin(_rwd_plugin_base_t ** pp)
{
*pp = new _rwd_dictcn_t();
return OK;
}

最后,我在主应用程序中使用创建器,以便像这样使用插件:

...
lt_dlhandle lh = lt_dlopen(filePath);
RWD_PLUGIN_CREATE_FUNC_T pPluginFunc = NULL;
if(lh)
{
pPluginFunc = reinterpret_cast<RWD_PLUGIN_CREATE_FUNC_T>(lt_dlsym(lh, "create_rwd_plugin"));

if(pPluginFunc)
{
RWD_PLUGIN_BASE_T * pBase = NULL;
if(OK == (*pPluginFunc)(&pBase))
{
RWD_PLUGIN_TYPE_T pluginType = pBase->get_plugin_type();
if(pluginType == RWD_PLUGIN_TYPE_AUTOCOMPELE)
{
...
RWD_PLUGIN_FUNC_T pPluginInitFunc = reinterpret_cast<RWD_PLUGIN_FUNC_T>(lt_dlsym(lh, "initialize_rwd_plugin"));
if(pPluginInitFunc)
(*pPluginInitFunc)(NULL);

// set proxy
RWD_AUTOCOMPLETE_PLUGIN_BASE_T * pAuto = dynamic_cast<RWD_AUTOCOMPLETE_PLUGIN_BASE_T*>(pBase);

...

问题是 dynamic_cast 总是失败并且 pAuto 最终为零。但是 WIN32 版本工作正常。问题发生在 autoconf2.61 automake1.10.1 make3.81 g++4.4.4 libtool1.5.26 的 linux 上。我对 linux 编程的经验较少,希望能在这里得到帮助。谢谢!

完整的源代码可以在 Sourceforge 上获取:svn公司https://rdwtwdb.svn.sourceforge.net/svnroot/rdwtwdb rdwtwdb

最佳答案

您可以尝试使用 -Wl,--export-dynamic 链接器参数进行构建。我记得遇到类似行为时需要这个参数。

关于c++ - dynamic_cast 由 lt_dlopen(libtool) 加载的共享库中的接口(interface)不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3237245/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com