Ⅰ M1 设备的 Xcode 编译问题深究
在Apple发布M1芯片之前,一直使用Intel的芯片,没有出现什么问题。发布M1芯片后,由于两者架构的不同(M1是arm64架构,Intel是x86_64的架构),导致很多软件运行出现了问题。我们在M1机型中使用Xcode编译模拟器时,可能会碰到如下报错:
或
这些报错,都是是由于项目中存在.a或.framework静态库导致的。以前,我们创建静态库时,会分别打包出一份针对真机(arm64)和模拟器的(x86_64),然后将这两份合并成一个包后引入项目中进行使用。在Intel机型上,真机上使用arm64指令,模拟器(x86_64)中使用x86_64指令,所以不存在问题。但是在M1机型上,模拟器是以arm64运行的,显然再以x86_64运行就会出现问题。
对于这类架构报错问题,网上的资料一般会告诉你两个解决方案:
以Rosetta模式运行Xcode。
修改Build Settings -> Excluded Architectures选项,添加Any iOS Simulator SDK选项,并设置值为arm64。图示如下:
这两种方案都能解决编译问题,但是也都存在问题。
以Rosetta模式运行是M1机器上x86软件无法运行的解决方案,它会将x86指令转译成ARM指令运行,这种转译显然是存在性能损耗的,损耗大概在20%~30%,不到万不得已,不推荐使用这种方案。
Excluded Architectures方案说明
修改Excluded Architectures选项也有它的问题。字面意思是排除架构的意思,我们设置在模拟器中排除arm64就能解决模拟器无法编译arm64的问题。
这样的设置能生效会让人有点费解,我们知道,在intel机型上,模拟器本来就是以x86方式运行的,排除arm64毫无影响。但是在M1机型上,模拟器是以arm64方式运行的,排除了arm64反而能跑,这不是把我的智商摁在地上摩擦么?,但是苹果就是这样干的,当在M1机型上,排除了模拟器的arm64架构后,模拟器还是会以arm64的方式运行,但是模拟器中的app是以x86的方式运行的,对苹果的这个骚操作我们不得不服。图示如下:
有时候在Excluded Architectures选项中排除了模拟器的arm64指令,依然无法编译通过,那么一般是项目设置和cocoapods的设置不一致导致,设置为一致后一般可以解决问题。可以通过在Podfile中添加如下内容来解决:
通过上述内容,我们知道了问题的由来,它是由于项目中存在.a或.framework,它们提供的指令集不完整导致的。Apple对于这类问题,也提供了解决方案,请由我细细道来。
以Xcode13为例,在我们创建静态库时,选择真机编译出来的包只包含arm64指令,选择模拟器编译出来的会同时包含arm64和x86_64指令。我看一些网上的教程,教别人将模拟器部分的arm64移除,其实大可不必。因为要支持M1机器正常跑模拟器,模拟器必须同时包含arm64和x86_64指令。
2019年的WWDC,apple提供了一种新的框架封装格式XCFramework。简单理解就是以前使用lipo合并不同指令集的包,现在则使用新的指令合并成XCFramework格式
打包成framework,格式如下:
打包成XCFramework后,格式如下:
从上述可以看出,XCFramework就是把两个不同指令集的framework放入了同一个文件夹(.xcframework),并生成了一个配置文件Info.plist。这样生成的XCFramework就可以完美的解决M1机器无法编译模拟器的问题。
XCFramework的创建指令也很简单:
以现在的情况,很多第三方框架,并没有使用XCFramework,而项目中只要有一个框架没有支持模拟器的arm64指令,那么在M1机器上,模拟器只能以Rosetta模式运行应用,对这一块的普遍支持估计要等M1普及以后了。
苹果换芯,成了开发者们的噩梦?
armv6、armv7、armv7s、armv8、armv64及其i386、x86_64区别
细说iOS静态库和动态库
关于Xcode11的XCFrameworks框架
Ⅱ linux涓嫔畨瑁卛nter缂栬疟鍑虹幇闂棰桡纴镓句笉鍒32-bit libraries not found on this system锛岃烽梾鏄镐庝箞锲炰簨锻锛
鐩存帴瀹夎32bit搴
yum鍦ㄧ嚎瀹夎咃细 sudo yum install xulrunner.i686
鎴栬咃细 sudo yum install ia32-libs.i686
ubuntu涓嬶细 sudo apt-get install ia32-libs
Ⅲ 编译vasp出现错误,求帮助,如能帮助,不胜感激
安装环境centOS6.5+Intel parallel studio xe 2013+openmpi+fftw
这是修改过makefile后make出现的错误:
fpp -f_com=no -free -w0 base.F base.f90 -DMPI -DHOST=\\"LinuxIFC\\" -DIFC -DCACHE_SIZE=4000 -DPGF90 -Davoidalloc -DNGZhalf -DMPI_BLOCK=8000 -Duse_collective -DscaLAPACK -DRPROMU_DGEMV -DRACCMU_DGEMV
mpif90 -FR -names lowercase -assume byterecl -O2 -ip -I/opt/intel/composer_xe_2013.2.146/mkl/include/fftw -c base.f90
mpif90: error while loading shared libraries: libimf.so: cannot open shared object file: No such file or directory
make: *** Error 127
这是我的修改过的makefile:
1 .SUFFIXES: .inc .f .f90 .F
2 #-----------------------------------------------------------------------
3 # Makefile for Intel Fortran compiler for Pentium/Athlon/Opteron
4 # based systems
5 # we recommend this makefile for both Intel as well as AMD systems
6 # for AMD based systems appropriate BLAS (libgoto) and fftw libraries are
7 # however mandatory (whereas they are optional for Intel platforms)
8 # For Athlon we recommend
9 # ) to link against libgoto (and mkl as a backup for missing routines)
10 # ) odd enough link in libfftw3xf_intel.a (fftw interface for mkl)
11 # feedback is greatly appreciated
12 #
13 # The makefile was tested only under Linux on Intel and AMD platforms
14 # the following compiler versions have been tested:
15 # - ifc.7.1 works stable somewhat slow but reliably
16 # - ifc.8.1 fails to compile the code properly
17 # - ifc.9.1 recommended (both for 32 and 64 bit)
18 # - ifc.10.1 partially recommended (both for 32 and 64 bit)
19 # tested build 20080312 Package ID: l_fc_p_10.1.015
20 # the gamma only mpi version can not be compiles
21 # using ifc.10.1
22 # - ifc.11.1 partially recommended (some problems with Gamma only and intel fftw)
23 # Build 20090630 Package ID: l_cprof_p_11.1.046
24 # - ifort.12.1 strongly recommended (we use this to compile vasp)
25 # Version 12.1.5.339 Build 20120612
26 #
27 # it might be required to change some of li