MacでiOS/Androidコンパイル（個人メモ）

全くの備忘用個人的メモ。
調べるたび追記、間違いもたくさん書くと思うので、判明すれば修正。

* iOSコンパイル情報設定

```shell-session:iOSコンパイル情報設定
default_iphoneos_version=7.1
default_architecture=armv7
 
export IPHONEOS_DEPLOYMENT_TARGET="${IPHONEOS_DEPLOYMENT_TARGET:-$default_iphoneos_version}"
DEFAULT_ARCHITECTURE="${DEFAULT_ARCHITECTURE:-$default_architecture}"

target=$1
shift
 
case $target in
 
        device )
        arch="${DEFAULT_ARCHITECTURE}"
        platform=iphoneos
        extra_cflags=" "
        ;;
 
        simulator )
        arch=i386
        platform=iphonesimulator
        extra_cflags="-D__IPHONE_OS_VERSION_MIN_REQUIRED=${IPHONEOS_DEPLOYMENT_TARGET%%.*}0000"
        ;;
 
        * )
        echo No target found!!!
        usage
        exit 2
 
esac
if [ $arch = "arm64" ]
    then
    host="arm-apple-darwin"
else
    host="${arch}-apple-darwin"
    extra_cflags="${extra_cflags} -DHAVE_LONG_LONG"
fi

platform_dir=`xcrun -find -sdk ${platform} --show-sdk-platform-path`
platform_sdk_dir=`xcrun -find -sdk ${platform} --show-sdk-path`
prefix="${prefix}/${arch}/${platform}${IPHONEOS_DEPLOYMENT_TARGET}.sdk"

#setup compiler flags
export CC=`xcrun -find -sdk iphoneos gcc`
export CFLAGS="-Wno-error=implicit-function-declaration -arch ${arch} -pipe -Os -gdwarf-2 -isysroot ${platform_sdk_dir} ${extra_cflags}"
export LDFLAGS="-arch ${arch} -isysroot ${platform_sdk_dir}"
export CXX=`xcrun -find -sdk iphoneos g++`
export CXXFLAGS="${CFLAGS}"
export CPP=`xcrun -find -sdk iphoneos cpp`
export CXXCPP="${CPP}"
export AR=`xcrun -find -sdk iphoneos ar`
export RANLIB=`xcrun -find -sdk iphoneos ranlib`
```

* Androidコンパイル情報設定

```shell-session:Androidコンパイル情報設定
default_android_version=17
default_architecture=armeabi
default_ndk_root=/android-ndk-r10d

export ANDROID_DEPLOYMENT_TARGET="${ANDROID_DEPLOYMENT_TARGET:-$default_android_version}"
DEFAULT_ARCHITECTURE="${DEFAULT_ARCHITECTURE:-$default_architecture}"
NDK_ROOT="${NDK_ROOT:-$default_ndk_root}" 

archname="${DEFAULT_ARCHITECTURE}"
arch="${archname}"
archdir="${arch}"

case $arch in
 
        mips )
        extra_cflags=" "
        extra_ldflags=" "
        host="mipsel-linux-android"
        ;;
 
        x86 )
        extra_cflags=" "
        extra_ldflags=" "
        host="i686-linux-android"
        ;;

        armeabi )
        arch=arm
        extra_cflags="-mthumb"
        extra_ldflags=" "
        host="arm-linux-androideabi"
        ;;

        armeabi-v7a )
        arch=arm
        extra_cflags="-march=armv7-a -mfloat-abi=softfp"
        extra_ldflags="-Wl,--fix-cortex-a8"
        host="arm-linux-androideabi"
        ;;
 
        * )
        echo No valid architecture found!!!
        usage
        exit 2
 
esac

#create toolchain if necesary
toolchain=`pwd`/android-${ANDROID_DEPLOYMENT_TARGET}-toolchain-${arch}
if [ ! -e ${toolchain} ]
then
    echo toolchain missing, creating
    ${NDK_ROOT}/build/tools/make-standalone-toolchain.sh \
        --platform=android-${ANDROID_DEPLOYMENT_TARGET} \
        --install-dir=${toolchain} \
        --arch=${arch} --system=darwin-x86_64
fi
export PATH=${toolchain}/bin:$PATH

#setup compiler flags
export CC="${toolchain}/bin/${host}-gcc"
export LIBS="-lsupc++ -lstdc++"
export CFLAGS="${extra_cflags} -DHAVE_LONG_LONG -pipe -Os -gdwarf-2"
export LDFLAGS="${extra_ldflags}"
export CXX="${toolchain}/bin/${host}-g++"
export CXXFLAGS="${CFLAGS}"
export CPP="${toolchain}/bin/${host}-cpp"
export CXXCPP="${CPP}"
```

* 静的ライブラリの作り方(iOS)

```shell-session:静的ライブラリ
${CXX} ${CXXFLAGS} -c -I. src_a.cpp -o src_a.o
${CXX} ${CXXFLAGS} -c -I. src_b.cxx -o src_b.o
${AR} -rcs libSrc.a src_a.o src_b.o
${RANLIB} libSrc.a
```

* Sharedライブラリの作り方(Android)

```shell-session:Sharedライブラリ
${CXX} ${CXXFLAGS} -c -fPIC -I. src_a.cpp -o src_a.o
${CXX} ${CXXFLAGS} -c -fPIC -I. src_b.cxx -o src_b.o 
${CC} -shared -Wl,-soname,libSrc.so.1 -I. -o libSrc.so src_a.o src_b.o
```

* シンボルテーブル確認(iOS)

```shell-session:シンボルテーブル確認
nm libSrc.a
```

* ライブラリのアーキテクチャ確認(iOS)

```shell-session:アーキテクチャ確認
lipo -info libSrc.a
```

* ライブラリのアーキテクチャ、シンボルテーブル確認(Android)

```shell-session:アーキテクチャ、シンボルテーブル確認
[各アーキテクチャのツールチェイン]/bin/[アーキテクチャ]-objdump -x libSrc.so | more
```