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