0

0

CTK插件框架学习4-创建跨平台插件工程「建议收藏」

雪夜

雪夜

发布时间:2025-07-12 09:24:27

|

585人浏览过

|

来源于php中文网

原创

大家好,又见面了,我是你们的朋友全栈君。

在之前的博客中,我们已经完成了一个简单的插件和测试程序的开发,但这些插件和应用是独立的工程。在实际的应用开发中,需要将相关的库和头文件整合到一个工程中,如下图所示,这样不仅方便调试和开发,还为创建跨平台工程提供了便利。

CTK插件框架学习4-创建跨平台插件工程「建议收藏」

本节我们将创建一个示例工程,工程文件中包含应用程序以及要使用的各个插件,同时将各个平台编译后的ctk插件库文件也整合到一起。目前支持以下三个平台:

系统 CPU 编译器 说明
windows x86_64 msvc 64位系统
linux x86_64 gcc 64位系统
linux arm64 gcc 64位系统

未来我们计划增加windows-mingw和linux-arm32两个平台的支持。接下来,让我们简单介绍一下工程的实现。

  1. 工程创建

    打开Qt Creator,选择文件 -> 新建文件或项目 -> 其他项目 -> Empty qmake Project,创建一个空的qmake工程,这里命名为CtkpluginProj

    CTK插件框架学习4-创建跨平台插件工程「建议收藏」

    通过文件浏览器进入该工程目录,新建三个目录,分别命名为applicationplugin-*plugindepends。其中application目录用于存放应用程序,plugin-*为创建的一个插件示例,plugindepends用来存放ctk库文件。目录创建完成后如下图所示,这里插件命名为appinfo,即一个用于获取应用信息的插件。

    CTK插件框架学习4-创建跨平台插件工程「建议收藏」

1.1 plugindepends文件拷贝

plugindepends目录下存放ctk库的头文件及其编译生成的库文件。首先将ctk源码目录中的Libs/CoreLibs/PluginFramework两个目录拷贝到plugindepends目录下,core目录和pluginframework目录中存放着插件与应用程序编译所依赖的头文件,同时需要将编译生成的两个头文件也拷贝过来,分别是ctkCoreExport.hctkPluginFrameworkExport.h,它们分别位于CTK-build/Libs/CoreCTK-build/Libs/PluginFramework目录下。

以上步骤仅拷贝所需的头文件,接下来开始拷贝编译ctk后生成的库文件。为了支持跨平台,这里为每个平台各创建一个目录,并将相应的库文件拷贝进去。目前在windows-x64linux-x64linux-arm64三个平台下编译了ctk库,因此这里创建lib-linux-arm64-gcclib-linux-x64-gcclib-windows-x64-msvc三个目录。创建完成后如下图所示。

CTK插件框架学习4-创建跨平台插件工程「建议收藏」

在linux和windows平台下需要拷贝的ctk库文件列表如下图所示。

CTK插件框架学习4-创建跨平台插件工程「建议收藏」

最后创建一个Plugindepends.pri文件,用于添加qt工程中的头文件与库文件路径描述,文件内容如下。

   INCLUDEPATH +=  $$PWD/../plugindepends/core/ \
                   $$PWD/../plugindepends/pluginframework/ \
                   $$PWD/../plugindepends/
<p>win32-msvc*{ # for windows visual studio 2015 x64 msvc compiler
equals(QT_ARCH, x86_64): LIBS += -L$$PWD/../plugindepends/lib-windows-x64-msvc/ -lCTKCore -lCTKPluginFramework
}</p><p>win32-g++{ # for mingw x64 compiler
equals(QT_ARCH, x86_64): LIBS += -L$$PWD/../plugindepends/lib-windows-x64-mingw/ -lCTKCore -lCTKPluginFramework
}</p><p>linux{ # for linux gcc x64 compiler
equals(QT_ARCH, x86_64): LIBS += -L$$PWD/../plugindepends/lib-linux-x64-gcc/ -lCTKCore -lCTKPluginFramework</p><h1>for linux gcc arm64 compiler</h1><pre class="brush:php;toolbar:false;"><code>   equals(QT_ARCH, arm64): LIBS += -L$$PWD/../plugindepends/lib-linux-arm64-gcc/ -lCTKCore -lCTKPluginFramework

}

1.2 创建第一个插件

第一个插件示例的功能是在运行时打印应用程序信息,其目录为plugin-appinfo。首先进入该目录,创建一个plugin-appinfo.pro文件,并填写以下内容。

   QT += core
QT -= gui</p><p>TARGET = plugin-appinfo
TEMPLATE = lib
CONFIG += plugin</p><p>include($$PWD/../plugindepends/Plugindepends.pri)

此时可以回到Qt Creator工具,修改工程文件CtkpluginProj.pro,添加以下内容。

   TEMPLATE = subdirs
SUBDIRS += \
plugin-appinfo/plugin-appinfo.pro</p><p>CONFIG += ordered

保存CtkpluginProj.pro文件后,工程界面如下图所示。

CTK插件框架学习4-创建跨平台插件工程「建议收藏」

此时右键点击plugin-appinfo,选择Add new,添加一个C++类,类名可以随意设置,这里命名为QPluginActivator,代码如下。

   /<strong><strong><strong><strong><strong><strong><strong><strong>* qpluginactivator.h ***</strong></strong></strong></strong></strong></strong></strong></strong>/</p><h1>ifndef QPLUGINACTIVATOR_H</h1><h1>define QPLUGINACTIVATOR_H</h1><h1>include <QObject></h1><h1>include "ctkPluginActivator.h"</h1><h1>include "ctkPluginContext.h"</h1><p>class QPluginActivator : public QObject, public ctkPluginActivator
{
Q_OBJECT
Q_PLUGIN_METADATA(IID "appinfo")
Q_INTERFACES(ctkPluginActivator)</p><p>public:
QPluginActivator();
void start(ctkPluginContext <em>context);
void stop(ctkPluginContext </em>context);
};</p><h1>endif // QPLUGINACTIVATOR_H</h1><p>/<strong><strong><strong><strong><strong><strong><strong><strong>* qpluginactivator.cpp ***</strong></strong></strong></strong></strong></strong></strong></strong>/</p><div class="aritcle_card flexRow">
                                                        <div class="artcardd flexRow">
                                                                <a class="aritcle_card_img" href="/ai/1108" title="Sora"><img
                                                                                src="https://img.php.cn/upload/ai_manual/001/246/273/68b6d9768f95f970.png" alt="Sora"  onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
                                                                <div class="aritcle_card_info flexColumn">
                                                                        <a href="/ai/1108" title="Sora">Sora</a>
                                                                        <p>Sora是OpenAI发布的一种文生视频AI大模型,可以根据文本指令创建现实和富有想象力的场景。</p>
                                                                </div>
                                                                <a href="/ai/1108" title="Sora" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a>
                                                        </div>
                                                </div><h1>include "qpluginactivator.h"</h1><h1>include <QDebug></h1><h1>include <QCoreApplication></h1><p>QPluginActivator::QPluginActivator()
{
}</p><p>void QPluginActivator::start(ctkPluginContext *)
{
qDebug() << QCoreApplication::applicationName();
qDebug() << QCoreApplication::applicationFilePath();
}</p><p>void QPluginActivator::stop(ctkPluginContext *)
{
qDebug() << "Plugin stopped";
}

然后新建资源文件,添加前缀/plugin-appinfo/META-INF,并在资源文件中创建MANIFEST.MF插件清单文件。创建完成后,工程界面如下图所示。

CTK插件框架学习4-创建跨平台插件工程「建议收藏」

1.3 创建第二个插件

第二个插件的创建就比较简单了,直接拷贝第一个插件的目录,进行一些简单修改即可。这里第二个示例插件命名为sysinfo,即加载插件时打印系统信息。首先通过文件浏览器进入到工程目录,拷贝plugin-appinfo插件目录为plugin-sysinfo,然后更改plugin-sysinfo目录下的plugin-appinfo.pro文件为plugin-sysinfo.pro,最后更改plugin-sysinfo.pro文件中的TARGET = plugin-sysinfo

接下来再次回到Qt Creator,修改工程文件CtkpluginProj.pro,在其SUBDIRS项添加一行plugin-sysinfo/plugin-sysinfo.pro,然后工程界面如下图所示。

CTK插件框架学习4-创建跨平台插件工程「建议收藏」

需要注意的是要修改资源文件resource.qrc的前缀,改成/plugin-sysinfo/META-INF,另外在qpluginactivator.cpp中根据需要更改插件功能,MANIFEST.MF清单文件中插件名称和版本号也可以重新设置。

1.4 创建应用程序

插件是为应用程序服务的,这里需要一个可执行程序来加载插件,从而调用插件的功能。首先进入工程的application目录,创建一个Application.pro文件,内容如下。

   QT -= gui
CONFIG += console
CONFIG -= app_bundle</p><p>include($$PWD/../plugindepends/Plugindepends.pri)

然后再次回到Qt Creator,修改工程文件CtkpluginProj.pro,在其SUBDIRS项添加一行application/Application.pro,然后工程界面如下图所示。

CTK插件框架学习4-创建跨平台插件工程「建议收藏」

右键点击application,选择Add new,添加一个C++源文件,命名为main.cpp,其代码如下。

   #include <QCoreApplication></p><h1>include <ctkPluginFrameworkFactory.h></h1><h1>include <ctkPluginFramework.h></h1><h1>include <ctkPluginException.h></h1><h1>include <ctkPluginContext.h></h1><h1>include <QDebug></h1><h1>include <QUrl></h1><h1>if defined(WIN32)</h1><pre class="brush:php;toolbar:false;"><code>   QString static appinfoPlugin_filePath = "../plugin-appinfo/debug/plugin-appinfo.dll";
   QString static sysinfoPlugin_filePath = "../plugin-sysinfo/debug/plugin-sysinfo.dll";

else

<code>   #ifdef __linux__
       QString static appinfoPlugin_filePath = "../plugin-appinfo/libplugin-appinfo.so";
       QString static sysinfoPlugin_filePath = "../plugin-sysinfo/libplugin-sysinfo.so";
   #endif</code>

endif

int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); ctkPluginFrameworkFactory frameworkFactory; QSharedPointer framework = frameworkFactory.getFramework();

<code>   // 初始化并启动插件框架
   try {
       framework->init();
       framework->start();
       QSharedPointer<ctkPluginContext> pluginContext = framework->getPluginContext();

       // 安装并启动插件appinfo
       try {
           // 安装插件
           QSharedPointer<ctkPlugin> plugin = pluginContext->installPlugin(QUrl::fromLocalFile(appinfoPlugin_filePath));
           qDebug() << QString("Installed plugin: %1 version %2").arg(plugin->getSymbolicName()).arg(plugin->getVersion().toString());
           // 启动插件
           plugin->start(ctkPlugin::START_TRANSIENT);
       } catch (const ctkPluginException &e) {
           qDebug() << "Error installing appinfo plugin:" << e.what();
       }

       // 安装并启动插件sysinfo
       try {
           // 安装插件
           QSharedPointer<ctkPlugin> plugin = pluginContext->installPlugin(QUrl::fromLocalFile(sysinfoPlugin_filePath));
           qDebug() << QString("Installed plugin: %1 version %2").arg(plugin->getSymbolicName()).arg(plugin->getVersion().toString());
           // 启动插件
           plugin->start(ctkPlugin::START_TRANSIENT);
       } catch (const ctkPluginException &e) {
           qDebug() << "Error installing sysinfo plugin:" << e.what();
       }
   } catch (const ctkPluginException &e) {
       qDebug() << "Error starting plugin framework:" << e.what();
   }

   return a.exec();</code>

}

  1. 运行应用

    在Qt Creator软件中,点击绿色三角的运行键,开始编译运行工程,它会自动先编译插件,最后编译运行应用程序。windows-msvc环境下编译运行结果如下图所示。

    CTK插件框架学习4-创建跨平台插件工程「建议收藏」

    linux-x86_64环境下编译运行结果如下图所示。

    CTK插件框架学习4-创建跨平台插件工程「建议收藏」

    linux-arm64环境下编译运行结果如下图所示。

    CTK插件框架学习4-创建跨平台插件工程「建议收藏」

    最后需要指出的是,这样编写工程的好处在于,迁移工程到一个已支持的平台上,不需要再先下载并编译配置CTK库,直接将整个工程代码拷贝到平台上编译运行即可,可以把精力集中在开发插件及应用程序上。

    整个工程代码我已上传到csdn资源-12075076,欢迎下载并编译验证。

发布者:全栈程序员栈长,转载请注明出处:https://www.php.cn/link/cd49f7f7616e5661b97901dc688b4385 原文链接:https://www.php.cn/link/c8377ad2a50fb65de28b11cfc628d75c

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
视频后缀名都有哪些
视频后缀名都有哪些

视频后缀名都有avi、mpg、mpeg、rm、rmvb、flv、wmv、mov、mkv、ASF、M1V、M2V、MPE、QT、VOB、RA、RMJ、RMS、RAM、等等。更多关于视频后缀名的相关知识,详情请看本专题下面的文章,php中文网欢迎大家前来学习。

3876

2023.10.31

C++ Qt图形开发
C++ Qt图形开发

本专题专注于 C++ Qt框架在图形界面开发中的应用,系统讲解窗口设计、信号与槽机制、界面布局、事件处理、数据库连接与跨平台打包等核心技能,通过多个桌面应用项目实战,帮助学员快速掌握 Qt 框架并独立完成跨平台GUI软件的开发。

76

2025.08.15

C++ 图形界面开发基础(Qt方向)
C++ 图形界面开发基础(Qt方向)

本专题系统讲解 使用 C++ 与 Qt 进行图形界面(GUI)开发的核心技能,内容涵盖 Qt 项目结构、窗口组件、信号与槽机制、事件处理、布局管理、资源管理,以及跨平台编译与打包流程。通过多个小型桌面应用实战案例,帮助学习者掌握从界面设计到功能实现的完整 GUI 开发能力。

111

2025.12.05

resource是什么文件
resource是什么文件

Resource文件是一种特殊类型的文件,它通常用于存储应用程序或操作系统中的各种资源信息。它们在应用程序开发中起着关键作用,并在跨平台开发和国际化方面提供支持。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

181

2023.12.20

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1010

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

611

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

334

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

235

2025.08.29

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

76

2026.03.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
CSS3 教程
CSS3 教程

共18课时 | 7万人学习

PostgreSQL 教程
PostgreSQL 教程

共48课时 | 10.5万人学习

NumPy 教程
NumPy 教程

共44课时 | 3.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号