我正在使用库的 makefile 移植 C/C++ 库。该库包含一个测试套件,当仅使用单一架构时,我无法让 EXE 按预期工作。以下是由 makefile 的配方生成的示例(添加格式以提高可读性):
$ export IOS_PLATFORM=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform
$ make static dynamic cryptest.exe
clang++ -DNDEBUG -g -Os -pipe -fPIC -arch armv7
--sysroot $(IOS_PLATFORM)/Developer/SDKs/iPhoneOS6.1.sdk
-miphoneos-version-min=5.0 -DCRYPTOPP_DISABLE_ASM=1 -c 3way.cpp
clang++ -DNDEBUG -g -Os -pipe -fPIC -arch armv7
--sysroot $(IOS_PLATFORM)/Developer/SDKs/iPhoneOS6.1.sdk
-miphoneos-version-min=5.0 -DCRYPTOPP_DISABLE_ASM=1 -c adler32.cpp
...
如果armv7
我如上所述使用单一架构 ( ) 构建 EXE ,则运行可执行文件会导致“可执行文件中的 CPU 类型错误”。file
告诉我它是 Mach-O 但不是通用的:
$ file cryptest.exe
cryptest.exe: Mach-O executable arm
如果armv7
我为多种架构(和)构建armv7s
,则程序按预期运行。
如果我为多个架构(armv7
和armv7s
)构建并剥离一个架构,则程序按预期运行:
$ mv cryptest.exe cryptest.exe.bu
$ xcrun -sdk iphoneos lipo cryptest.exe.bu -remove armv7s -output cryptest.exe
$ codesign -fs "Jeffrey Walton" cryptest.exe
cryptest.exe: replacing existing signature
$ file cryptest.exe.bu
cryptest.exe.bu: Mach-O universal binary with 2 architectures
cryptest.exe.bu (for architecture armv7): Mach-O executable arm
cryptest.exe.bu (for architecture armv7s): Mach-O executable arm
$ file cryptest.exe
cryptest.exe: Mach-O universal binary with 1 architecture
cryptest.exe (for architecture armv7): Mach-O executable arm
是否可以指示 Apple 的命令行工具构建具有额外通用标头的二进制文件,即使它只有一个拱门(以节省删除未使用架构的额外工作)?