使用Intel编译器生成通用二进制遇警告,是否为编译器限制?
关于Intel编译器在MacOSX下多架构编译警告的解答
这个警告并非操作错误,而是Intel编译器(ICC)在Mac平台上的固有限制,和GCC的多架构处理逻辑完全不同。
原因解析
GCC在Mac上原生支持通过单次命令指定多个-arch参数(比如gcc -arch i386 -arch x86_64),编译器会自动为每个架构完成编译,后续可以直接用lipo合并成通用二进制。但Intel编译器的Mac版本不支持这种“一次编译多架构”的模式——当你同时传入多个-arch参数时,它只会识别并使用最后一个参数,同时抛出#10121警告提示你前面的架构参数被覆盖了。
正确的多架构编译流程
要在Intel编译器下生成通用二进制,需要分步骤为每个架构单独编译、链接,再合并:
- 分别编译每个架构的目标文件:
icc -arch i386 -c your_source.c -o your_source_i386.o icc -arch x86_64 -c your_source.c -o your_source_x86_64.o - 为每个架构链接生成单独的可执行文件:
icc -arch i386 your_source_i386.o -o your_app_i386 icc -arch x86_64 your_source_x86_64.o -o your_app_x86_64 - 用
lipo工具合并成通用二进制:lipo -create your_app_i386 your_app_x86_64 -output your_app_universal
这种分步骤处理是Intel编译器在Mac上的标准用法,并非缺陷。如果需要频繁处理这类任务,可以写个简单的Shell脚本自动化整个流程,减少重复操作。
内容的提问来源于stack exchange,提问作者gil_mo
相关产品推荐
相关产品推荐

