【编译脚本】macos下libfdk-aac三个ios平台最新的编译脚本i386 arm7 arm7s

前言

在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脚本

【编译脚本】macos下libfdk-aac三个ios平台最新的编译脚本i386 arm7 arm7s_第1张图片

打开终端,进入新建的文件夹,给build-fdk-aac.sh提权,然后运行编译

【编译脚本】macos下libfdk-aac三个ios平台最新的编译脚本i386 arm7 arm7s_第2张图片

等待几分钟,lib及include文件生成成功

【编译脚本】macos下libfdk-aac三个ios平台最新的编译脚本i386 arm7 arm7s_第3张图片


遇到的问题

编译中遇到了很多问题,主要耗时如下

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

m1entus / build-ffmpeg.sh,https://gist.github.com/m1entus/6983547

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





你可能感兴趣的:(ios,脚本,ARM,libfdk-aac)