Trouble building a plugin in Qt5 wtih CMake for my project.
-
I'm trying to make a program that will be extensible via plugins. I've modeled it somewhat off of cloud compare: https://github.com/cloudcompare/trunk but I can't get my plugin's to load correctly.
My interface:
@class NodePluginFactory
{public:
NodePluginFactory() {}
virtual ~NodePluginFactory() {}
virtual QStringList nodes() const = 0;
virtual boost::shared_ptrEagleLib::Node createNode(const QString& nodeName, QWidget* parent) = 0;};
Q_DECLARE_INTERFACE(NodePluginFactory, "com.danalex.EagleLib.NodePluginFactory/0.1")
@My Plugin:
@#include <QObject>
#include "../../EagleLib/include/Factory.h"
#include "../../EagleLib/include/nodes/Node.h"
#include <list>class VisualizationFactory: public QObject, public NodePluginFactory
{
Q_OBJECT
Q_INTERFACES(NodePluginFactory)
Q_PLUGIN_METADATA(IID "myTestPlugin")
public:
VisualizationFactory(QObject* parent = 0);
virtual ~VisualizationFactory() {}
virtual QStringList nodes();
virtual EagleLib::Node::Ptr createNode(const std::string &nodeName, QWidget* parent);
private:
std::map<std::string, EagleLib::NodeFactory::Ptr> factories;
};@
My Plugin cmake file:
@cmake_minimum_required(VERSION 2.8)
PROJECT(VisualizationPlugin)find_package(Qt5 REQUIRED Core)
INCLUDE_DIRECTORIES(
${Qt5Core_INCLUDE_DIRS}
${QT_QTCORE_INCLUDE_DIR}
${QT_INCLUDE_DIR}
${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_CURRENT_BINARY_DIR})
SET(src Visualization.cpp)
SET(hdr Visualization.hpp)
message(${CMAKE_CURRENT_SOURCE_DIR})
QT5_WRAP_CPP(MOC ${hdr} ${src})
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${Qt5Widgets_EXECUTABLE_COMPILE_FLAGS}")add_library(VisualizationPlugin SHARED ${src} ${hdr} ${MOC})
TARGET_LINK_LIBRARIES(VisualizationPlugin
Qt5::Core)
qt5_use_modules(${PROJECT_NAME} Core)
@Everything builds correctly, but when I try to load the plugin, I always get a null return from loader.instance():
@void MainWindow::on_pushButton_clicked()
{
QDir dir(qApp->applicationDirPath());
dir.cd("plugins");
QStringList filters;
filters << ".so";
foreach(QString fileName, dir.entryList(filters))
{
QPluginLoader loader(dir.absoluteFilePath(fileName));
QObject plugin = loader.instance();
if(plugin)
{
NodePluginFactory* NodePlugin = qobject_cast<NodePluginFactory*>(plugin);
}
}
}
@CloudCompare is pretty much the best example that I've been able to find that works, is with CMake and uses Qt5. And I've checked and double checked but I can't seem to find what I'm missing. I could really use some pointers here.