因此,1.0的GStreamer文档似乎......至少可以说 . GStreamer SDK有一些helpul tips,但不可思议的是它们不足 .
所以,这里完成了's what I' . 我在 /Library/GStreamer.Framework/ Build 了一个调用GStreamer的应用程序
我使用命令行工具构建 . 这是我可以构建这个应用程序的方式 only . 我无法使用XCode GUI .
我想将此应用程序提交到商店,但是为了这样做,我无法将其作为包提交(因此我可以捆绑GStreamer软件包安装程序),这意味着我必须将GStreamer.framework与我的应用程序捆绑在一起 .
在上面的GStreamer SDK文档中,您会注意到一个名为osxrelocator.py的工具 . 这很好,因为它将 /Library/GStreamer.Framework 的所有引用更改为 @executable_path/../Frameworks/GStreamer.framework/
但
不幸的是,所有GStreamer .dylib都有问题......您需要使用install_name_tool -id来更改其路径,因为install_name_tool -change不会更改自己的路径!
所以,例如使用otool:
$ 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_name_tool -change):
./osxrelocator.py Application.app/Contents/MacOS /Library/Frameworks/GStreamer.framework/Versions/Current/lib @executable_path/../Frameworks/GStreamer.framework/Versions/Current/lib -r
得到:
$ 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_name_tool -id,否则不会更改为@executable_path /../ Frameworks / GStreamer.framework / . 这种情况发生在GStreamer框架中的每个.dylib!有数百个,我敢肯定手动这样做肯定会导致错误 .
希望我已经明确了我的问题 . 有没有人对如何做有任何建议?
谢谢!
1 回答
我创建了一个简单的Xcode项目来向您展示如何捆绑框架:https://github.com/corrosion/gstreamer-osx-bundle.git
对于库重定位使用:https://github.com/tito/osxrelocator
使用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_name_tool -id @executable_path/../Frameworks/GStreamer.framework/GStreamer ./GStreamer-devel.framework/Versions/Current/GStreamer
将"$(PROJECT_DIR)/GStreamer-devel.framework/Headers"添加到 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_path/../Frameworks/GStreamer.framework/
由于在gst_init期间执行了gst-plugin-scanner,因此它必须能够找到所有库 . 因此,在libexec目录中创建指向"Frameworks"的链接以解析@executable_path /../ Frameworks / GStreamer.framework /
ln -sf ../../../../ GStreamer.framework/Versions/Current/libexec/Frameworks
在项目的Build Phases设置中,创建新的Copy Files Phase并将GStreamer.framework复制到Fameworks
在调用gst_init()之前,在代码中设置GST_PLUGIN_SCANNER和GST_PLUGIN_SYSTEM_PATH环境变量: