先来看一段 MakeFile 脚本:
OUT = libkugouplayer_VIPER3DRender.a
OBJS = \
../../Limiter.cpp \
../../ViPER3DEffect.cpp \
../../../AudioEffect.cpp
INCLUDE = -I../../../ \
-I../../../../utils \
-I../../../../include \
-I../../../../resampler \
-I../../../surround \
-I../../../../thirdpartylibrary/ffmpeg/build/master/arm/include/ \
LIB = ../libViPER3D.a
CC = /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang
SDK_VERSION=10.12
SDKPATH=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX${SDK_VERSION}.sdk
$(OUT) : $(OBJS)
CC -c $(OBJS) -arch x86_64 -isysroot $(SDKPATH) $(INCLUDE)
ar rc $(OUT) *.o $(LIB)
clean:
rm -f *.o $(OUT)
在做组件化的过程中,为了给 Mac 版的酷狗音乐也提供音效组件,在打包依赖到libViPER3D.a
这个包含全架构(i386 armv7 x86_64 arm64)的组件库的时候遇到了如下的错误:
2 warnings generated.
ar rc libkugouplayer_VIPER3DRender.a *.o ../libViPER3D.a
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ranlib: archive member: libkugouplayer_VIPER3DRender.a(libViPER3D.a) fat file for cputype (7) cpusubtype (3) is not an object file (bad magic number)
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ar: internal ranlib command failed
make: *** [libkugouplayer_VIPER3DRender.a] Error 1
错误里面提示到了libViPER3D.a
是一个 fat file ,估计是跟这个有关。用 lipo
查看了一下libVipER3D.a
的架构
lipo -info libViPER3D.a
Architectures in the fat file: libViPER3D.a are: i386 armv7 x86_64 arm64
确实是一个 fat file ,那么就单独分离出一个 x86_64
的架构出来试试。
lipo libViPER3D.a -thin x86_64 -output libViPER3D_x86_64.a
然后再重新打包了一下发现就可以了。BINGO!
另外记录一下遇到的另外一个问题,在打包包含有静态库的库时,不要这样写
LIB = -L../ -llibViPER3D.a
,这样写是不会把它打包进去的;而且不要把$(LIB)
这个放在编译CC
那行,而要放在打包ar
的时候再把它打进去,直接写路径就好了,这样
LIB = ../libViPER3D.a
要不然老是会报找不到路径,挺奇怪的。