我在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
答案 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上运行,但如果使用它们将会崩溃,因为编译器在编译时不会因为预期存在而对它们发出警告。