一、概述
- CTK的官网:http://www.commontk.org/index.php/Main_Page
- CTK源码下载地址:https://github.com/commontk/CTK
- ctkPluginFramework编译
ctkPluginFramwwork编译
调试CtkPluginFramework源码
ctkPluginFramework编译(qt5.12_vs2017_gcc4.8) - 某渲染客户端的框架结构
1> CTKPlugin插件系统框架。负责整个项目的架构,决定了项目采用插件形式开发维护。
2> Google protocol buffer。负责定义项目的通信协议,它是google内部使用的协议架构,最大的优点是:实现高效,向下兼容的通信协议。
3> Zeromq框架:负责项目中的网络通信,用于高性能网络编程。
4> 日志系统。负责项目中所有日志的输出
二、主程序开发
#include <QCoreApplication>
#include <ctkPluginFrameworkFactory.h>
#include <ctkPluginFramework.h>
#include <ctkPluginException.h>
#include <ctkPluginContext.h>
#include <QtDebug>
#include <QUrl>
#ifdef __MINGW32__
// 使用mingw编译器时的定义
QString static firstPlugin_filePath = "E:/lwks/build-ctk-plugin-first-Desktop_Qt_5_12_3_MinGW_64_bit-Debug/debug/ctk-plugin-first.dll";
#else
// 使用msvc编译器时的定义
QString static firstPlugin_filePath = "E:/lwks/build-ctk-plugin-first-Desktop_Qt_5_12_3_MSVC2017_64bit-Debug/debug/ctk-plugin-first.dll";
#endif
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
ctkPluginFrameworkFactory frameworkFactory;
QSharedPointer<ctkPluginFramework> framework = frameworkFactory.getFramework();
// 初始化并启动插件框架
try {
framework->init();
framework->start();
qDebug() << "CTK plugin framework start...";
} catch (const ctkPluginException &e) {
qDebug() << "CTK plugin framework init err: " << e.what();
return -1;
}
// 获取插件服务的contex
ctkPluginContext* pluginContext = framework->getPluginContext();
try {
// 安装插件
QSharedPointer<ctkPlugin> plugin = pluginContext->installPlugin(QUrl::fromLocalFile(firstPlugin_filePath));
qDebug() << QString("Plugin[%1_%2] installed...").arg(plugin->getSymbolicName()).arg(plugin->getVersion().toString());
// 启动插件
plugin->start(ctkPlugin::START_TRANSIENT);
qDebug() << "Plugin start...";
} catch (const ctkPluginException &e) {
qDebug() << QString("Failed install or run plugin: ") << e.what();
return -2;
}
return a.exec();
}
三、插件的开发
ctkPlugin插件简单开发
1、Activator.h
#include <ctkPluginActivator.h>
class Activator:public QObject, public ctkPluginActivator
{
Q_OBJECT
Q_INTERFACES(ctkPluginActivator)
Q_PLUGIN_METADATA(IID "plugName")
public:
explicit Activator(QObject *parent=0);
~Activator();
void start(ctkPluginContext *context);
void stop(ctkPluginContext *context);
}
2、Activator.cpp
#include "Activator.h"
Activator::Activator(QObject *parent):QObject(parent)
{
this->setObjectName("plugName");
}
Activator::~Activator()
{
}
void Activator::start(ctkPluginContext *context)
{
}
void Activator::stop(ctkPluginContext *context)
{
}