Macos 在OSX应用程序包中分发自定义Qt插件

Macos 在OSX应用程序包中分发自定义Qt插件,macos,qt,plugins,bundle,Macos,Qt,Plugins,Bundle,我正在构建一个自定义应用程序,该应用程序将某些功能划分为Qt插件。使用QPluginLoader和qobject\u cast,这项功能一直运行得很好,但到目前为止,我一直使用硬编码的绝对路径(在它运行之前,我不想让事情复杂化!) 我几乎需要将应用程序部署到其他机器上,所以我决定尝试将插件打包到应用程序包中(我主要是为OSX构建这个包)。这需要一些研究,但这是我得出的结论: MyApp.pro文件: 这提供了一个很好的包结构,看起来像这样: MyApp.app | +- Contents

我正在构建一个自定义应用程序,该应用程序将某些功能划分为Qt插件。使用
QPluginLoader
qobject\u cast
,这项功能一直运行得很好,但到目前为止,我一直使用硬编码的绝对路径(在它运行之前,我不想让事情复杂化!)

我几乎需要将应用程序部署到其他机器上,所以我决定尝试将插件打包到应用程序包中(我主要是为OSX构建这个包)。这需要一些研究,但这是我得出的结论:

MyApp.pro文件: 这提供了一个很好的包结构,看起来像这样:

MyApp.app
 |
 +- Contents
     |
     +- MacOS
     |   |
     |   +- MyApp
     |
     +- Plugins
     |   |
     |   +- libMyPlugin.dylib
     |
     ... other support files ...
因此,我将插件路径添加到库搜索路径:

main.cpp: 然后尝试加载插件,如下所示:

// ...

QPluginLoader pluginLoader;
pluginLoader.setFileName("libPhotoshopPlugin.dylib");
IMyPluginInterface* plugin = qobject_cast<IMyPluginInterface*>(pluginLoader.instance());

// ...
/。。。
QPluginLoader插件加载程序;
setFileName(“libPhotoshopPlugin.dylib”);
IMyPluginInterface*plugin=qobject_cast(pluginLoader.instance());
// ...
不幸的是,插件总是显示为空。但当我这么做的时候:

// ...

QPluginLoader pluginLoader;
pluginLoader.setFileName("../Plugins/libPhotoshopPlugin.dylib");
IMyPluginInterface* plugin = qobject_cast<IMyPluginInterface*>(pluginLoader.instance());

// ...
/。。。
QPluginLoader插件加载程序;
pluginLoader.setFileName(“../Plugins/libPhotoshopPlugin.dylib”);
IMyPluginInterface*plugin=qobject_cast(pluginLoader.instance());
// ...
我得到了插件实例,一切正常

为什么我必须在传递给QPluginLoader的文件名中指定路径?它不应该从
QApplication
库路径中获取它吗?是不是有什么事我只是做错了?(我猜测并希望这种可能性更大)


补充说明: 如果我将MyApp.pro文件中的plugins.path更改为
Contents/MacOS
,libMyPlugin.dylib将在MyApp旁边获得输出,一切正常。如果这是我应该做的事情,我很乐意继续做下去


但是显示了部署在
Contents/plugins
目录中的Qt插件(qtjpeg和类似的),以及将目录添加到
QApplication
库路径的类似方法。

我将插件存储在application.app/Contents/plugins中,并使用以下代码获取插件目录:

...    
#elif defined(Q_OS_MAC)
    QDir pluginsDir = QDir(qApp->applicationDirPath());
    pluginsDir.cdUp();
    pluginsDir.cd("plugins");
#else
...
现在您有了正确的plugins目录路径,可以加载插件了。我在application.app/Contents/Resources中还有一个文件qt.conf,包含以下内容:

[Paths]
Plugins = plugins

我将插件存储在application.app/Contents/plugins中,并使用以下代码获取插件目录:

...    
#elif defined(Q_OS_MAC)
    QDir pluginsDir = QDir(qApp->applicationDirPath());
    pluginsDir.cdUp();
    pluginsDir.cd("plugins");
#else
...
现在您有了正确的plugins目录路径,可以加载插件了。我在application.app/Contents/Resources中还有一个文件qt.conf,包含以下内容:

[Paths]
Plugins = plugins