1

我正在使用库的 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,则程序按预期运行。

如果我为多个架构(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 的命令行工具构建具有额外通用标头的二进制文件,即使它只有一个拱门(以节省删除未使用架构的额外工作)?

4

1 回答 1

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 
于 2013-07-08T19:29:26.843 回答