最近项目需要从头搭建一个软件框架,在网上看到推荐CTK Plugins Framework这个插件框架,感觉很适合我这个项目,于是在网上开始搜寻教程。关于CTK的介绍,网上其实挺多的,随便一搜就能搜到,这里就不重复介绍了。
推荐一个编译的教程:编译教程
推荐一个实例仓库,我也在跟着这个仓库的项目学习:项目仓库
遇到的错误
在网上寻找教程时,看到有各种各样的版本搭配,比如Qt5.14 + vs2017、Qt5.12 + vs2015等等(大概印象,具体可能不是这个搭配,勿参考)。我也没想那么多,选择了Qt 5.15.4 + vs2019这个搭配来编译链接库。整个编译的过程还挺顺利,我分别编译了debug版本和release版本的动态链接库,但是我写了一个测试程序(如下)来加载这个库时,就遇到问题了。
QCoreApplication app(argc, argv);
ctkPluginFrameworkFactory frameWorkFactory;
QSharedPointer<ctkPluginFramework> framework = frameWorkFactory.getFramework();
try {
// 初始化并启动插件框架
framework->init();
framework->start();
qDebug() << "CTK Plugin Framework start ...";
} catch (const ctkPluginException &e) {
qDebug() << "Failed to initialize the plugin framework: " << e.what();
qDebug() << e.message() << e.getType();
return -1;
}
在release下能正常运行,在debug模式下,执行到 framework->init(); 处时就会报错,大概的错误信息就是:
“底层发现一个错误,程序无法继续执行 Exception at 0x7ff9de62cf19, code: 0xe06d7363: C++ exception, flags=0x1 (execution cannot be continued)"
解决思路
当在网上发现大家没有讨论CTK遇到的这个问题,我就开始怀疑是编译的配置可能不对,于是我又尝试了Qt5.12.11 + vs2017的配置,发现问题仍然存在,但是又存在一点点不一样。这次执行到framework->init(); 处时,程序没有弹出错误,但是无法继续往下运行,从堆栈信息来看,程序执行了init函数后,直接退出main函数了。
不同的qt和vs版本造成的现象竟然不同,那可能就是编译配置不对。于是我考虑用教程里的版本来试试,最终我的版本搭配为Qt5.14.0+vs2017,实测最终debug和release下都可以正常调用该库。
总结
我也没想到QT和vs版本的搭配不对会产生这样的问题,但让我不疑惑的是官方和网友们都没有提到这个问题,难道就我遇到这个问题了。
不过好在现在问题解决了,可以开始专心研究一下这个框架。后续也有可能继续更新关于学习CTK方面的文章,可以点个关注,一起讨论。
希望我的回答和解决思路能给您提供一点帮助。