Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos OSX部署:第三方库在/应用程序中加载插件(自定义),而不是捆绑_Macos_Qt_Plugins - Fatal编程技术网

Macos OSX部署:第三方库在/应用程序中加载插件(自定义),而不是捆绑

Macos OSX部署:第三方库在/应用程序中加载插件(自定义),而不是捆绑,macos,qt,plugins,Macos,Qt,Plugins,我正在尝试为MacOSX创建一个应用程序包。我正在使用一个第三方库(Marble,KDE的一部分,但只为Qt构建),它使用自己的自定义插件,我不知道如何处理这个问题。以下是我所做的: 编译我的包 使用macdeployqt将Qt库复制到捆绑包中,并告诉二进制文件使用这些库(这似乎是将Marble library libmarblewidget.dylib复制到应用程序捆绑包中,并修复其库依赖关系) 将Marble插件复制到bundle.app/Contents/plugins/Marble(其中

我正在尝试为MacOSX创建一个应用程序包。我正在使用一个第三方库(Marble,KDE的一部分,但只为Qt构建),它使用自己的自定义插件,我不知道如何处理这个问题。以下是我所做的:

  • 编译我的包
  • 使用macdeployqt将Qt库复制到捆绑包中,并告诉二进制文件使用这些库(这似乎是将Marble library libmarblewidget.dylib复制到应用程序捆绑包中,并修复其库依赖关系)
  • 将Marble插件复制到bundle.app/Contents/plugins/Marble(其中bundle.app是我的bundle),并使用install_name_工具将它们链接到bundle中的Qt和Marble库
  • 但是,我的应用程序不会运行。我已经用DYLD_PRINT_LIBRARIES=1运行了它,以查看加载了什么,在从/Applications/Marble.app/Contents/MacOS/resources/plugins/而不是从我的包中的plugins目录加载插件之前,一切看起来都很好。此时,插件尝试加载/Developer Qt库,而不是包副本(以及我在/usr/local/lib中获得的libmarblewidget.dylib副本),结果全部崩溃


    我可能误解了这个问题,但在我看来,问题在于第三方库(libmarblewidget.dylib)加载了Marble应用程序包插件,这会把一切都搞糟。假设我是正确的,有没有办法告诉这个库使用我的应用程序包中的PlugIns目录?我需要重新编译吗?

    大理石硬编码文件MarbleDirs.cpp中的插件(和数据)位置。插件的预期位置为

    bundle.app/Contents/Resources/plugins
    
    至于数据:

    bundle.app/Contents/Resources/data
    
    只要插件和数据在这些目录中,并且所有插件的ID和链接都使用install_name_工具修复,应用程序就会正常运行,只链接到捆绑包中的Qt和Marble库。插件是.so文件而不是.dylib,这似乎不是问题


    在qt.conf中,插件的值设置为什么并不重要,libmarblewidget.dylib将始终查看这些位置。

    如果您在插件dylib上运行otool-L,它是否有指向插件的路径,您可以使用install\u name\u工具设置这些路径?您是指库dylib吗?不管怎样,我已经在插件(.so文件)和库上运行了otool-L,显示的所有内容要么在bundle(@executable\u path/./something)中,要么在系统(不是Qt)库中。您已经提到了插件(.so文件)。如果它们是linux使用的共享library.so文件,这将是一个问题,因为OSX不使用该格式,但有自己的二进制类型Mach-O。这包含动态链接器dyld修复动态库调用的头。看这里:我知道,但这就是Marble库编译插件的方式(即使在MacOSX上)。实际上,只要我不修改包来使用包库,它们在Marble应用程序中以及在我的应用程序中都可以正常加载。这是因为插件的位置基本上是硬编码到库中的。我会发布一个完整的解决方案,一旦我整理了一些细节。