简体   繁体   中英

Cocoa app with ffmpeg dylibs crashes on Mac OSX 10.5 (but not 10.6 or 10.7)

I've built a Cocoa project in Xcode that integrates the ffmpeg dylibs. It runs fine on Mac OSX 10.6 and 10.7 but it crashes on 10.5. I'm compiling on 10.6. Any suggestions? Thanks!

Here's how I've compiled it:

./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-version-min=10.5"

Here's the crash report:

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

I believe the problem you're running into is that libavcodec isn't fully 64-bit compatible under 10.5. I'm not 100% certain of this though.

64-bit support wasn't fully fleshed out in 10.5 and so for most of my own 64-bit-native apps, I have to explicitly tell the OS to run the 32-bit versions of my binary when running under 10.5.

To do this, go into your Info.plist file and add in these flags:

<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>

This will ensure your app runs in 32-bit mode on Leopard machines and 64-bit mode (if appropriate) on your 10.6 & newer machines.

Binaries compiled on 10.6 don't work on earlier OS X versions because 10.6 adds new dyld load commands that are not supported (did not exist) in 10.5 and earlier.

Although you are trying to add -mmacosx-version-min=10.5 to the flags which is commendable, you did not add it to the linking step, so the linker will still produce a dyld for 10.6.

The above is the reason for the error, but you may further get into trouble for using 10.6 SDK - you should really use 10.5 SDK if you want to target Leopard. Using 10.6 SDK may work on 10.5 if no 10.6-specific features are used, but it will crash if they are used since the compiler won't warn about them at compile time as they are expected to exist.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM