Apple命令行工具:使用单个拱形强制通用二进制文件?

时间:2013-07-08 00:28:51

标签: iphone ios xcode command-line

我正在使用库的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
...

IF 我使用单一架构(armv7)构建EXE,然后运行可执行文件结果为“可执行文件中的CPU类型错误”。 file告诉我它是Mach-O而不是Universal:

$ file cryptest.exe
cryptest.exe: Mach-O executable arm

IF 我为多个架构(armv7armv7s)构建,然后程序按预期运行。

IF 我为多个架构(armv7armv7s)构建并剥离架构,然后程序按预期运行:

$ 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的命令行工具使用额外的通用标头构建二进制文件,即使它只有单个arch(以节省删除未使用的体系结构的额外工作)?

1 个答案:

答案 0 :(得分:1)

我无法找到构建通用二进制文件的开关;而且我无法追踪Apple正在执行的Xcode魔术。我确实发现你可以构建一个非通用二进制文件(单一架构),然后运行lipo来创建通用。

$ make cryptest.exe
clang++ -o cryptest.exe -DNDEBUG -g -Os -pipe -fPIC -arch armv7
  --sysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk
  -miphoneos-version-min=5.0 -DCRYPTOPP_DISABLE_ASM=1
  bench.o bench2.o test.o validat1.o validat2.o validat3.o adhoc.o datatest.o regtest.o fipsalgt.o dlltest.o ./libcryptopp.a  
$ lipo -info cryptest.exe
Non-fat file: cryptest.exe is architecture: armv7
$ lipo cryptest.exe -create -output cryptest.exe
$ lipo -info cryptest.exe
Architectures in the fat file: cryptest.exe are: armv7