我正在使用库的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 我为多个架构(armv7
和armv7s
)构建,然后程序按预期运行。
IF 我为多个架构(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的命令行工具使用额外的通用标头构建二进制文件,即使它只有单个arch(以节省删除未使用的体系结构的额外工作)?
答案 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