在Mac OSX 10.5上使用ffmpeg dylibs的Cocoa应用程序崩溃(但不是10.6或10.7)

时间:2011-11-08 18:03:14

标签: objective-c xcode macos cocoa ffmpeg

我在Xcode中构建了一个集成了ffmpeg dylibs的Cocoa项目。它在Mac OSX 10.6和10.7上运行良好,但它在10.5上崩溃。我正在编译10.6。有什么建议?谢谢!

以下是我编译它的方式:

  

./ configure --disable-static --enable-shared --disable-outdev = sdl   --enable-runtime-cpudetect --disable-bzlib --disable-libfreetype --disable-libopenjpeg --enable-zlib --arch = x86_64 --sysroot = / Developer / SDKs / MacOSX10.6.sdk --extra- cflags =“ - isysroot /Developer/SDKs/MacOSX10.6.sdk-DMACOSX_DEPLOYMENT_TARGET = 10.5   -mmacosx版本分钟= 10.5"

这是崩溃报告:

Process:         MyApp [27963]
Path:            /Applications/MyApp.app/Contents/MacOS/MyApp
Identifier:      com.mycompany.MyApp
Version:         ??? (???)
Code Type:       X86-64 (Native)
Parent Process:  launchd [66]

Interval Since Last Report:          123326 sec
Crashes Since Last Report:           2
Per-App Interval Since Last Report:  0 sec
Per-App Crashes Since Last Report:   2

Date/Time:       2011-11-06 15:29:51.154 -0500
OS Version:      Mac OS X 10.5.8 (9L31a)
Report Version:  6
Anonymous UUID:  D86EA304-DCDA-4855-9124-69FE8C5BDE1B

Exception Type:  EXC_BREAKPOINT (SIGTRAP)
Exception Codes: 0x0000000000000002, 0x0000000000000000
Crashed Thread:  0

Dyld Error Message:
  Library not loaded: @rpath/libavcodec.dylib
  Referenced from: /Applications/MyApp.app/Contents/MacOS/../Frameworks/MyEngine.framework/Versions/A/MyEngine
  Reason: no suitable image found.  Did find:
    /Applications/MyApp.app/Contents/Frameworks/MyEngine.framework/Versions/A/Libraries/libavcodec.dylib: unknown required load command 0x80000022

2 个答案:

答案 0 :(得分:1)

我相信你遇到的问题是libavcodec在10.5下并不完全是64位兼容的。我不是百分之百肯定的。

在10.5中没有完全充实64位支持,因此对于我自己的大多数64位原生应用程序,我必须明确告诉O.S.在10.5下运行时运行我的二进制文件的32位版本。

为此,请进入Info.plist文件并添加以下标志:

<key>LSMinimumSystemVersionByArchitecture</key>
<dict>
    <key>i386</key>
    <string>10.5.0</string>
    <key>ppc</key>
    <string>10.5.0</string>
    <key>x86_64</key>
    <string>10.6.0</string>
</dict>

这将确保您的应用程序在Leopard计算机上以32位模式运行,并在10.6&amp; 10上以64位模式运行(如果适用)更新的机器。

答案 1 :(得分:1)

在10.6上编译的二进制文件不适用于早期的OS X版本,因为10.6添加了10.5及更早版本中不支持(不存在)的新dyld加载命令。

虽然您尝试将-mmacosx-version-min=10.5添加到值得称道的标记中,但您没有将其添加到链接步骤,因此链接器仍将生成10.6的dyld。

以上是导致错误的原因,但您可能会因使用10.6 SDK而遇到麻烦 - 如果您想要定位Leopard,则应该使用10.5 SDK。如果没有使用10.6特定的功能,使用10.6 SDK可能会在10.5上运行,但如果使用它们将会崩溃,因为编译器在编译时不会因为预期存在而对它们发出警告。