C/C++ 有很多成熟的库,还有很多特殊功能的库,有时候iOS 平台开发一些比较前沿或者冷门的功能时,iOS并没有提供解决方案,这时候就可以研究C/C++的一些库,为我们使用。但是在Xcode编译C/C++ 源码简直是噩梦,今天就讲一下把下载的C/C++ 库编译成静态.a 这种熟悉的方式调用。
需要提醒的是:要具备一定的脚本知识,以及编译的步骤。不懂得需要花时间去一点点研究。不是一天两天就能理解全部的,自己也在不断的研究中。
目标:
Mac OS X10.14.1 _xcode10.1_ios12.1环境下,编译lame静态库libmp3lame.a,支持arm64 armv7s x86_64 i386 armv7指令集
准备:
- 下载 lame 库:http://sourceforge.net/projects/lame/files/lame/3.99/
- 下载最新版本lame的解压到一个文件夹里我放到桌面 :例如 lame_cross_build
(图-1)
脚本:
下载一个脚本: https://github.com/kewlbear/lame-ios-build
脚本下载后解压:得到 build-lame.sh 脚本
将脚本复制到(图-1)lame-3.100 文件夹下
修改脚本内容:
#!/bin/sh
# 脚本所在地址
PakagePath=`pwd`
echo "脚本所在地址-----:$PakagePath"
cd ..
# 包所在地址
BasePath=`pwd`
echo "包所在地址-----:$BasePath"
#回到脚本所在地址
cd "$PakagePath"
echo "回到脚本所在地址pwd-----:`pwd` "
CONFIGURE_FLAGS="--disable-shared --disable-frontend"
ARCHS="arm64 armv7s x86_64 i386 armv7"
# directories
# 存放最终的合成的真机、模拟器通用的 .a 的文件夹
FAT=$BasePath/fat-lame
echo "FAT地址-----:$FAT "
# 存放脚本执行过程产生的对应不同架构的库文件夹
SCRATCH=$BasePath/scratch-lame
# 存放各个架构.a 和 include w
THIN=$BasePath/"thin-lame"
COMPILE="y"
LIPO="y"
if [ "$*" ]
then
if [ "$*" = "lipo" ]
then
# skip compile
COMPILE=
else
ARCHS="$*"
if [ $# -eq 1 ]
then
# skip lipo
LIPO=
fi
fi
fi
if [ "$COMPILE" ]
then
CWD=`pwd`
for ARCH in $ARCHS
do
echo "building $ARCH..."
mkdir -p "$SCRATCH/$ARCH"
cd "$SCRATCH/$ARCH"
if [ "$ARCH" = "i386" -o "$ARCH" = "x86_64" ]
then
PLATFORM="iPhoneSimulator"
if [ "$ARCH" = "x86_64" ]
then
SIMULATOR="-mios-simulator-version-min=7.0"
HOST=x86_64-apple-darwin
else
SIMULATOR="-mios-simulator-version-min=5.0"
HOST=i386-apple-darwin
fi
else
PLATFORM="iPhoneOS"
SIMULATOR=
HOST=arm-apple-darwin
fi
XCRUN_SDK=`echo $PLATFORM | tr '[:upper:]' '[:lower:]'`
CC="xcrun -sdk $XCRUN_SDK clang -arch $ARCH"
CFLAGS="-arch $ARCH $SIMULATOR"
if ! xcodebuild -version | grep "Xcode [1-6]\."
then
CFLAGS="$CFLAGS -fembed-bitcode"
fi
CXXFLAGS="$CFLAGS"
LDFLAGS="$CFLAGS"
CC=$CC $CWD/configure \
$CONFIGURE_FLAGS \
--host=$HOST \
--prefix="$THIN/$ARCH" \
CC="$CC" CFLAGS="$CFLAGS" LDFLAGS="$LDFLAGS"
make -j3 install
cd $CWD
done
fi
if [ "$LIPO" ]
then
echo "building fat binaries..."
mkdir -p $FAT/lib
set - $ARCHS
CWD=`pwd`
cd $THIN/$1/lib
for LIB in *.a
do
cd $CWD
lipo -create `find $THIN -name $LIB` -output $FAT/lib/$LIB
done
cd $CWD
cp -rf $THIN/$1/include $FAT
#验证合并的.a 架构
cd $FAT/lib
for LIB in *.a
do
lipo -info $LIB
done
#打开合并的.a 所在位置
open $FAT/lib
fi
最后:执行脚本
Last login: Thu May 9 16:56:17 on ttys000
lzz-Mac-mini:~ suning$ cd /Users/suning/Desktop/lame_cross_build/lame-3.100
lzz-Mac-mini:lame-3.100 suning$ ./build-lame.sh
看到支持的架构arm64 armv7s x86_64 i386 armv7