KDE的组件(Part)是不需要在编译链接的时候进行依赖的。用户可以通过KPluginLoader自动到KDE的服务目录下去寻找所需的组件。另外也可以通过KServiceTypeTrader查询注册的服务。基本上KPluginLoader和KLibLoader是一脉相承的,它提供kde3factory以及kde4factory静态函数查找指定的库文件是否存在。kde*factory最后是通过QLibrary的resolve方法去查询指定的库中是否包含特定的C函数(在C++编译的库中使用了extern "C"声明的函数)。kde3factory查找init_libname(libname是库的名字),kde4factory查找qt_plugin_instance,一旦找到则调用(最终是使用dlsym)相应的函数创建构造组件实例的工厂对象。
例子1:
m_factory = KPluginLoader("libkecko").factory();
if ( !m_factory ) {
m_factory =:KLibLoader:self()->factory("libkecko");
if ( !m_factory ) {
kDebug() << "create factory for keckopart failed";
return;
}
}
|
libkecko是库的名字,与之对应的,你必须提供init_libkecko或者qt_plugin_instance来创建生成组件实例的工厂对象。注意KDE4建议定义组件的名字时不使用lib前缀,比如应该是foo.so而不是libfoo.so,如果有lib前缀,kde3factory函数会有警告信息,其实没有很大关系。
例子2:
void *ph =dlopen("/mnt/sda5/programs/lib/kde4/libkecko.so", RTLD_LAZY); if ( !ph ) { char *err = dlerror(); kDebug() << "dlopen failed: " << QString(err); } else {
dlerror();
char *err = NULL;
void* pf = dlsym( ph, "init_libkecko");
if ( (err = dlerror()) != NULL )
kDebug() << QString(err);
dlclose(ph); }
|
上面的例子演示了如何查找库中相应的函数的方法。
阅读(1095) | 评论(0) | 转发(0) |