前言
在mac下编译libfdk-aac实在太轻松,想不到编译到i386、arm7、arm7s遇到了很多困难,
终于解决了,拿出来分享下,也恶补了一部分编译知识
编译环境*重点
本脚本适用于mac环境下xcode5以上版本
网上找了很多编译版本,都已经过时,很多编译器的路径找不到,
自从xcode5之后已经把编译器放到了${DEVELOPER}/Toolchains/XcodeDefault.xctoolchain/usr/bin下
本脚本使用的是clang来编译
如果你xcode版本比较低,请先修改编译器的位置
脚本
下面贡献给大家一个编译脚本
build-fdk-aac.sh
#!/bin/bash
SDKVERSION="7.0"
LIB_PATH="fdk-aac-0.1.3"
#ARCHS="armv7 armv7s i386"
ARCHS="i386 armv7s armv7"
OUTPUTDIR="dependencies/lib_fdkaac"
OLD_DEVELOPER_PATH="/Developer"
NEW_DEVELOPER_PATH="/Applications/Xcode.app/Contents/Developer"
# Get the install path
if [ -d "$NEW_DEVELOPER_PATH" ]
then
DEVELOPER="$NEW_DEVELOPER_PATH"
else
DEVELOPER="$OLD_DEVELOPER_PATH"
fi
CurrentPath=$(cd "$(dirname "$0")"; pwd)
LIB_PATH="$CurrentPath/$LIB_PATH"
OUTPUTDIR="$CurrentPath/$OUTPUTDIR"
cd $LIB_PATH
for ARCH in ${ARCHS}
do
if [ "${ARCH}" == "i386" ];
then
PLATFORM="iPhoneSimulator"
else
PLATFORM="iPhoneOS"
fi
PLATFORM_SDK="${DEVELOPER}/Platforms/${PLATFORM}.platform/Developer/SDKs/${PLATFORM}${SDKVERSION}.sdk"
MIN_VERSION_FLAG="-miphoneos-version-min=${SDKVERSION}"
HOST="${ARCH}-apple-darwin"
export CC="${DEVELOPER}/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang"
export CFLAGS="${MIN_VERSION_FLAG} -arch ${ARCH}"
export LDFLAGS="${MIN_VERSION_FLAG} -arch ${ARCH} -isysroot ${PLATFORM_SDK}"
export LIBS="-L${PLATFORM_SDK}/usr/lib"
export CXXFLAGS="${MIN_VERSION_FLAG} -arch ${ARCH} -I${PLATFORM_SDK}/usr/include"
mkdir -p "${OUTPUTDIR}/${ARCH}"
make clean
echo "** CC=${CC}"
echo "** CFLAGS=${CFLAGS}"
echo "** LDFLAGS=${LDFLAGS}"
echo "** LIBS=${LIBS}"
echo "** CXXFLAGS=${CXXFLAGS}"
./configure --prefix="${OUTPUTDIR}/${ARCH}" --host="${HOST}" --with-sysroot="${PLATFORM_SDK}"
make && make install && make clean
done
mkdir -p "${OUTPUTDIR}/universal/lib"
cd "${OUTPUTDIR}/armv7/lib"
for file in *.a
do
cd "${OUTPUTDIR}"
xcrun -sdk iphoneos lipo -output universal/lib/$file -create -arch armv7 armv7/lib/$file -arch armv7s armv7s/lib/$file -arch i386 i386/lib/$file
echo "Universal $file created."
done
cp -r ${OUTPUTDIR}/armv7/include ${OUTPUTDIR}/universal/
echo "Done."
使用方法
建一个文件夹,把build-fdk-aac.sh拷贝到这个文件夹内,从网上下载fdk-aac-0.1.3及以上库解压拷贝到此文件夹中
如下图所示,本例建了个文件夹buildffmpeg,里面包含了build-fdk-aac.sh脚本及fdk-aac-0.1.3脚本
打开终端,进入新建的文件夹,给build-fdk-aac.sh提权,然后运行编译
等待几分钟,lib及include文件生成成功
遇到的问题
编译中遇到了很多问题,主要耗时如下
1、CXXFLAGS没加-arch 386,因为是编译CXX,
否则会报Undefined symbols for architecture i386:
2、几个FLAGS没加-miphoneos-version-min=7.0,原因是新版本的xcode使用了clang,必须加上,
否则会报ld: building for MacOSX, but linking against dylib built for iOS Simulator file
涉及的编译知识
1、CFLAGS 与 CXXFLAGS
CFLAGS 表示用于 C 编译器的选项,CXXFLAGS 表示用于 C++ 编译器的选项。这两个变量实际上涵盖了编译和汇编两个步骤。大多数程序和库在编译时默认的优化级别是"2"(使用"-O2"选项)并且带有调试符号来编译,也就是 CFLAGS="-O2 -g", CXXFLAGS=$CFLAGS 。事实上,"-O2"已经启用绝大多数安全的优化选项了。另一方面,由于大部分选项可以同时用于这两个变量,所以仅在最后讲述只能用于其中一个变量的选项。[提醒]下面所列选项皆为非默认选项,你只要按需添加即可。
2、-I dir 在头文件的搜索路径中添加目录dir目录。在include语句中“<>”表示在默认路径“/usr/include”和/usr/local/include中搜索头文件,引号“”表示在本目录下搜索。如果在即编写头文件,如果头文件位置与当前.c文件不在同一个目录,则就需要利用-I 头文件所在目录即可。
3、-L dir gcc到系统默认的路径“/usr/lib”下查找库文件。头文件包含声明, 而编译后的库文件包含函数实现或者与DLL库的连接,在库文件的搜索路径列表中添加dir目录,“-L dir”指定的是路径,而不是文件,所以不能在路径中包含文件名。如果需要包含指定文件就要用到“-llibrary”参数,它可以指定GCC去找库文件。linux下有一个规定:必须以l/i/b三个字母开头,因此在用“-I” 指定链接库文件时可以省去lib三个字母。同时也可以省去链接库的版本号。
4、LDFLAGS:gcc 等编译器会用到的一些优化参数,也可以在里面指定库文件的位置。用法:LDFLAGS=-L/usr/lib -L/path/to/your/lib。每安装一个包都几乎一定的会在安装目录里建立一个lib目录。如果明明安装了某个包,而安装另一个包时,它愣是说找不到,可以抒那个包的lib路径加入的LDFALGS中试一下。
5、CC是制定使用的编译器
参考引用
脚本参考了
SDL2.0库的iosbuild.sh
freetype2.4.6在iOS上各版本的编译脚本,http://blog.csdn.net/madongchunqiu/article/details/12402257
内容参考了
cmake-ld-building-for-macosx-but-linking-against-dylib-built-for-ios-simulator,http://stackoverflow.com/questions/18682267/cmake-ld-building-for-macosx-but-linking-against-dylib-built-for-ios-simulator
编译优化,关于CFLAGS与CXXFLAGS ,http://xiayongchun2009.blog.163.com/blog/static/4908511320122610156565/
gcc编译中常用参数: -I dir -L dir -w -Wall -On,http://hi.baidu.com/demonncut/item/fe4402719387d6126dc37cd2
Makefile选项CFLAGS,LDFLAGS,LIBS,http://www.cnblogs.com/taskiller/archive/2012/12/14/2817650.html