Macos 使用Mac OS X应用程序部署GStreamer框架的最佳方法?

Macos 使用Mac OS X应用程序部署GStreamer框架的最佳方法?,macos,app-store,gstreamer,dylib,install-name-tool,Macos,App Store,Gstreamer,Dylib,Install Name Tool,因此,1.0+的GStreamer文档似乎……至少缺少一点。gstreamersdk有一些功能,但遗憾的是它们没有达到要求 这就是我所做的。我在/Library/GStreamer.Framework/ 我使用命令行工具构建。这是我构建此应用程序的唯一方法。我不能使用XCode GUI 我想将此应用程序提交到应用商店,但为此,我无法将其作为包提交(因此我可以捆绑GStreamer包安装程序),这意味着我必须将GStreamer.framework与我的应用程序捆绑在一起 在上面的GStreame

因此,1.0+的GStreamer文档似乎……至少缺少一点。gstreamersdk有一些功能,但遗憾的是它们没有达到要求

这就是我所做的。我在/Library/GStreamer.Framework/

我使用命令行工具构建。这是我构建此应用程序的唯一方法。我不能使用XCode GUI

我想将此应用程序提交到应用商店,但为此,我无法将其作为包提交(因此我可以捆绑GStreamer包安装程序),这意味着我必须将GStreamer.framework与我的应用程序捆绑在一起

在上面的GStreamer SDK文档中,您会注意到一个名为osxrelocator.py的工具。这很好,因为它将/Library/GStreamer.Framework的所有引用更改为@executable\u path/./Frameworks/GStreamer.Framework/

但是

不幸的是,所有的GStreamer.dylibs都有一个问题。。。您需要使用install\u name\u tool-id来更改它们的路径,因为install\u name\u tool-change不会更改它们自己的路径

例如,使用耳石:

$ otool -L Application.app/Contents/Frameworks/GStreamer.framework/Versions/1.0/lib/libgstreamer-1.0.0.dylib
Application.app/Contents/Frameworks/GStreamer.framework/Versions/1.0/lib/libgstreamer-1.0.0.dylib:
    Library/Frameworks/GStreamer.framework/Versions/1.0/lib/libgstreamer-1.0.0.dylib (compatibility version 402.0.0, current version 402.0.0)
    Library/Frameworks/Frameworks/GStreamer.framework/Versions/1.0/lib/libgobject-2.0.0.dylib (compatibility version 4001.0.0, current version 4001.0.0)
    Library/Frameworks/GStreamer.framework/Versions/1.0/lib/libffi.6.dylib (compatibility version 7.0.0, current version 7.1.0)
    Library/Frameworks/GStreamer.framework/Versions/1.0/lib/libgmodule-2.0.0.dylib (compatibility version 4001.0.0, current version 4001.0.0)
    Library/Frameworks/Frameworks/GStreamer.framework/Versions/1.0/lib/libglib-2.0.0.dylib (compatibility version 4001.0.0, current version 4001.0.0)
    Library/Frameworks/Frameworks/GStreamer.framework/Versions/1.0/lib/libintl.8.dylib (compatibility version 10.0.0, current version 10.2.0)
    Library/Frameworks/Frameworks/GStreamer.framework/Versions/1.0/lib/libiconv.2.dylib (compatibility version 8.0.0, current version 8.1.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1197.1.1)
    /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version 855.14.0)
然后使用osxrelocator.py(调用install\u name\u tool-change):

给出:

$ otool -L Application.app/Contents/Frameworks/GStreamer.framework/Versions/1.0/lib/libgstreamer-1.0.0.dylib
Application.app/Contents/Frameworks/GStreamer.framework/Versions/1.0/lib/libgstreamer-1.0.0.dylib:
    /Library/Frameworks/GStreamer.framework/Versions/1.0/lib/libgstreamer-1.0.0.dylib (compatibility version 402.0.0, current version 402.0.0)
    @executable_path/../Frameworks/GStreamer.framework/Versions/1.0/lib/libgobject-2.0.0.dylib (compatibility version 4001.0.0, current version 4001.0.0)
    @executable_path/../Frameworks/GStreamer.framework/Versions/1.0/lib/libffi.6.dylib (compatibility version 7.0.0, current version 7.1.0)
    @executable_path/../Frameworks/GStreamer.framework/Versions/1.0/lib/libgmodule-2.0.0.dylib (compatibility version 4001.0.0, current version 4001.0.0)
    @executable_path/../Frameworks/GStreamer.framework/Versions/1.0/lib/libglib-2.0.0.dylib (compatibility version 4001.0.0, current version 4001.0.0)
    @executable_path/../Frameworks/GStreamer.framework/Versions/1.0/lib/libintl.8.dylib (compatibility version 10.0.0, current version 10.2.0)
    @executable_path/../Frameworks/GStreamer.framework/Versions/1.0/lib/libiconv.2.dylib (compatibility version 8.0.0, current version 8.1.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1197.1.1)
    /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version 855.14.0)
注意.dylib引用自身的第一行吗?除非调用install\u name\u tool-id,否则不会更改为@executable\u path/。/Frameworks/GStreamer.framework/。GStreamer框架中的每个.dylib都会发生这种情况!有数百个,我相信手动操作肯定会导致错误

希望我已经把我的问题说清楚了。有人对该怎么做有什么建议吗


谢谢

我创建了一个简单的Xcode项目,向您展示如何捆绑框架:


图书馆搬迁用途:


使用XCode生成项目的安装程序:

  • 安装gstreamer-1.0-1.5.2-x86_64.pkg
  • 安装gstreamer-1.0-devel-1.5.2-x86_64.pkg
  • 将/Library/Frameworks/GStreamer.framework移动到$(PROJECT_DIR)/GStreamer-devel.framework
  • 转到$(PROJECT_DIR)并运行以下命令:
  • osxrelocator./GStreamer-devel.framework/Versions/Current/Library/Frameworks/GStreamer.framework/
    pwd
    /GStreamer-devel.framework/
  • install\u name\u tool-id@executable\u path/。/Frameworks/GStreamer.framework/GStreamer./GStreamer-devel.framework/Versions/Current/GStreamer
  • 将“$(项目目录)/GStreamer-devel.framework/Headers”添加到头搜索路径
  • 将“GStreamer-devel.framework/GStreamer”文件添加到Xcode项目中

准备运行时框架:

  • 安装gstreamer-1.0-1.5.2-x86_64.pkg
  • 将/Library/Frameworks/GStreamer.framework移动到$(PROJECT_DIR)/GStreamer.framework
  • 对框架进行一些清理:
  • rm./GStreamer.framework/Headers./GStreamer.framework/Commands
  • rm./GStreamer.framework/Versions/Current/Commands
  • rm-r./GStreamer.framework/Versions/Current/bin/
  • rm-r./GStreamer.framework/Versions/Current/etc/
  • rm-r./GStreamer.framework/Versions/Current/share/
  • 重新定位框架的.dylibs:
  • osxrelocator-r./GStreamer.framework/Versions/Current/Library/Frameworks/GStreamer.framework/@executable\u path/./Frameworks/GStreamer.framework/
  • 由于gst插件扫描程序在gst_init期间执行,因此它还必须能够找到所有库。 因此,在libexec目录中创建指向“Frameworks”的链接,以解析@executable\u path/。/Frameworks/GStreamer.framework/
  • ln-sf../../../../GStreamer.framework/Versions/Current/libexec/Frameworks
  • 在项目的构建阶段设置中,创建新的复制文件阶段并将GStreamer.framework复制到Fameworks

在调用GST_init()之前,在代码中设置GST_PLUGIN_SCANNER和GST_PLUGIN_SYSTEM_PATH环境变量:


我想可能是静态链接文件?这带来了以下问题:我使用ldflags链接:-F/Library/Frameworks-framework-GStreamer,似乎没有一种静态链接框架的方法?
$ otool -L Application.app/Contents/Frameworks/GStreamer.framework/Versions/1.0/lib/libgstreamer-1.0.0.dylib
Application.app/Contents/Frameworks/GStreamer.framework/Versions/1.0/lib/libgstreamer-1.0.0.dylib:
    /Library/Frameworks/GStreamer.framework/Versions/1.0/lib/libgstreamer-1.0.0.dylib (compatibility version 402.0.0, current version 402.0.0)
    @executable_path/../Frameworks/GStreamer.framework/Versions/1.0/lib/libgobject-2.0.0.dylib (compatibility version 4001.0.0, current version 4001.0.0)
    @executable_path/../Frameworks/GStreamer.framework/Versions/1.0/lib/libffi.6.dylib (compatibility version 7.0.0, current version 7.1.0)
    @executable_path/../Frameworks/GStreamer.framework/Versions/1.0/lib/libgmodule-2.0.0.dylib (compatibility version 4001.0.0, current version 4001.0.0)
    @executable_path/../Frameworks/GStreamer.framework/Versions/1.0/lib/libglib-2.0.0.dylib (compatibility version 4001.0.0, current version 4001.0.0)
    @executable_path/../Frameworks/GStreamer.framework/Versions/1.0/lib/libintl.8.dylib (compatibility version 10.0.0, current version 10.2.0)
    @executable_path/../Frameworks/GStreamer.framework/Versions/1.0/lib/libiconv.2.dylib (compatibility version 8.0.0, current version 8.1.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1197.1.1)
    /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version 855.14.0)
// Setup GSTreamer environment
NSString *frameworksPath = [[NSBundle mainBundle] privateFrameworksPath];
NSString *scannerPath = [NSString stringWithFormat:@"%@/%s", frameworksPath,
                         "GStreamer.framework/Versions/1.0/libexec/gstreamer-1.0/gst-plugin-scanner"];
NSString *pluginsPath = [NSString stringWithFormat:@"%@/%s", frameworksPath,
                         "GStreamer.framework/Versions/1.0/lib"];
setenv("GST_PLUGIN_SCANNER", [scannerPath UTF8String], 1);
setenv("GST_PLUGIN_SYSTEM_PATH", [pluginsPath UTF8String], 1);

// Initialize GStreamer
gst_init(&argc, (char ***) &argv);