1、引言
CloudCompare作为一款强大的点云与网格处理系统,提供了很多插件功能。
2、问题
在CMake时勾选了很多插件功能,但是生成后的Plugins是灰色无法使用的。
3、思考
这个问题也是CloudCompare机制的亮点之一。在此引用某大佬的话:“1)cmake只是生成可以供各种ide编译的工程文件 并不是生成插件dll; 2)生成了插件dll 要查看输出目录是否正确 vs的工程默认输出的插件dll exe是找不到的 要放到同一目录下 把dll放到plugins目录下 这个目录是exe默认搜索dll的位置。”
4、发现
(1)首先查看CloudCompare安装目录下有plugins文件夹,里面存在很多插件功能的dll;
(2)然后查看源码mainwindow.cpp中的函数:ccPluginInterface* MainWindow::getValidPlugin(QObject* plugin)、
void MainWindow::loadPlugins()、bool MainWindow::dispatchPlugin(QObject *plugin)。
其中很重要的是一句话:m_pluginsPath = QCoreApplication::applicationDirPath()+QString("/plugins");
也就是说需要读取CloudCompare生成目录下的plugins目录里面的dll,获取插件功能。
//部分代码已删除
void MainWindow::loadPlugins()
{
menuPlugins->setEnabled(false);
menuShadersAndFilters->setEnabled(false);
toolBarPluginTools->setVisible(false);
toolBarGLFilters->setVisible(false);
//"static" plugins
foreach (QObject *plugin, QPluginLoader::staticInstances())
dispatchPlugin(plugin);
ccConsole::Print(QString("Application path: ")+QCoreApplication::applicationDirPath());
//plugins are in bin/plugins
m_pluginsPath = QCoreApplication::applicationDirPath()+QString("/plugins");
ccConsole::Print(QString("Plugins lookup dir.: %1").arg(m_pluginsPath));
QStringList filters;
filters << "*.dll";
QDir pluginsDir(m_pluginsPath);
pluginsDir.setNameFilters(filters);
foreach (QString filename, pluginsDir.entryList(filters))
{
QPluginLoader loader(pluginsDir.absoluteFilePath(filename));
QObject* plugin = loader.instance();
if (plugin)
{
ccConsole::Print(QString("Found new plugin: '%1'").arg(filename));
if (dispatchPlugin(plugin))
{
m_pluginFileNames += filename;
}
else
{
delete plugin;
plugin = 0;
ccConsole::Warning("\tUnsupported or invalid plugin type");
}
}
else
{
delete plugin;
plugin = 0;
ccConsole::Warning(QString("[Plugin] %1")/*.arg(pluginsDir.absoluteFilePath(filename))*/.arg(loader.errorString()));
}
}
}
5、解决
以qRANSAC_SD为例
在CloudCompare的build位置\qCC\Release目录下新建文件夹plugins
将CC的build位置\plugins\qRANSAC_SD\Release\QRANSAC_SD_PLUGIN.dll
复制到CC的build位置\qCC\Release\plugins目录下