Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. How to build-in a static Qt plugin into an application with CMake?
Forum Updated to NodeBB v4.3 + New Features

How to build-in a static Qt plugin into an application with CMake?

Scheduled Pinned Locked Moved Solved General and Desktop
4 Posts 2 Posters 2.5k Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • D Offline
    D Offline
    devel
    wrote on last edited by
    #1

    http://stackoverflow.com/questions/41977236/how-to-build-in-a-static-qt-plugin-into-an-application-with-cmake

    I'd like to embed a custom virtual audio device plugin into an application. The QAudioSystemPlugin looks suitable for this task.

    But it doesn't load.

    CMakeLists.txt:

    cmake_minimum_required(VERSION 2.8.11)
    
    project(myproject)
    
    find_package(Qt5 5.5.0 REQUIRED COMPONENTS
        Core
        Multimedia
    )
    
    set(CMAKE_AUTOMOC ON)
    add_definitions("-DQT_STATICPLUGIN")
    
    add_executable(${PROJECT_NAME}
        main.cpp
        VirtualQAudioSystemPlugin.cpp
    )
    
    target_link_libraries(${PROJECT_NAME}
        Qt5::Core
        Qt5::Multimedia
    )
    
    set_property(TARGET ${PROJECT_NAME} PROPERTY CXX_STANDARD 11)
    

    main.cpp:

    #include <iostream>
    
    #include <QCoreApplication>
    #include <QAudioDeviceInfo>
    #include <QtPlugin>
    
    Q_IMPORT_PLUGIN(VirtualQAudioSystemPlugin)
    
    int main(int argc, char *argv[])
    {
    	QCoreApplication app(argc, argv);
    
    	for (const auto& dev : QAudioDeviceInfo::availableDevices(QAudio::AudioInput))
    		std::cerr << dev.deviceName().toStdString() << "\n";
    
    	return app.exec();
    }
    

    VirtualQAudioSystemPlugin.hpp:

    #pragma once
    
    #include <QtMultimedia/QAudioSystemPlugin>
    
    class VirtualQAudioSystemPlugin: public QAudioSystemPlugin
    {
    	Q_OBJECT
    	Q_PLUGIN_METADATA(IID "org.qt-project.qt.audiosystemfactory/5.0" FILE "virtual.json")
    
    public:
    	VirtualQAudioSystemPlugin(QObject *parent = 0);
    	~VirtualQAudioSystemPlugin() {}
    
    	virtual QList<QByteArray> availableDevices(QAudio::Mode mode) const override;
    	virtual QAbstractAudioInput* createInput(const QByteArray& device) override;
    	virtual QAbstractAudioOutput* createOutput(const QByteArray& device) override;
    	virtual QAbstractAudioDeviceInfo* createDeviceInfo(const QByteArray& device, QAudio::Mode mode) override;
    };
    

    VirtualQAudioSystemPlugin.cpp:

    #include "VirtualQAudioSystemPlugin.hpp"
    
    #include <iostream>
    
    VirtualQAudioSystemPlugin::VirtualQAudioSystemPlugin(QObject *parent) :
    		QAudioSystemPlugin(parent)
    {
    	std::cerr << "VirtualQAudioSystemPlugin\n";
    }
    
    QList<QByteArray> VirtualQAudioSystemPlugin::availableDevices(QAudio::Mode mode) const
    {
    	std::cerr << "VirtualQAudioSystemPlugin\n";
    }
    
    QAbstractAudioInput* VirtualQAudioSystemPlugin::createInput(const QByteArray &device)
    {
    	std::cerr << "VirtualQAudioSystemPlugin\n";
    }
    
    QAbstractAudioOutput* VirtualQAudioSystemPlugin::createOutput(const QByteArray &device)
    {
    	std::cerr << "VirtualQAudioSystemPlugin\n";
    }
    
    QAbstractAudioDeviceInfo* VirtualQAudioSystemPlugin::createDeviceInfo(const QByteArray &device, QAudio::Mode mode)
    {
    	std::cerr << "VirtualQAudioSystemPlugin\n";
    }
    

    virtual.json:

    {
        "Keys": ["default"]
    }
    

    Build and launch: the constructor of the VirtualQAudioSystemPlugin is not executed.

    How to make it load?

    1 Reply Last reply
    0
    • SGaistS Offline
      SGaistS Offline
      SGaist
      Lifetime Qt Champion
      wrote on last edited by
      #2

      Hi,

      From what I can see, it should rather be something like:

      class VirtualQAudioSystemPlugin : public QAudioSystemPlugin, public QAudioSystemPluginExtension
      {
          Q_OBJECT
          Q_PLUGIN_METADATA(IID "org.qt-project.qt.audiosystemfactory/5.0" FILE "virtual.json")
          Q_INTERFACES(QAudioSystemPluginExtension)
      etc.
      

      You can also set the QT_DEBUG_PLUGINS environment variable to 1 to get more information about what is happening.

      Interested in AI ? www.idiap.ch
      Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

      1 Reply Last reply
      1
      • D Offline
        D Offline
        devel
        wrote on last edited by
        #3

        That class isn't present in the current Qt version.

        Can anyone reproduce the problem?

        1 Reply Last reply
        0
        • D Offline
          D Offline
          devel
          wrote on last edited by
          #4

          The problem was because of the 'default' in virtual.json: it was overridden by other plugins. If there are no other plugins, the object is instantiated.

          Had to change to something different like 'virtual'.

          {
              "Keys": ["virtual"]
          }
          
          1 Reply Last reply
          0

          • Login

          • Login or register to search.
          • First post
            Last post
          0
          • Categories
          • Recent
          • Tags
          • Popular
          • Users
          • Groups
          • Search
          • Get Qt Extensions
          • Unsolved