最近在搞iphone上的电子书,需要把电子书为zip格式的解压,然后在google后发现了libzzip这个库,加进工程,模拟器上编译通过,但在真机测试,报错: libzzip.a is not of required architecture. 排查很久还是
最近在搞iphone上的电子书,需要把电子书为zip格式的解压,然后在google后发现了libzzip这个库,加进工程,模拟器上编译通过,但在真机测试,报错:libzzip.a is not of required architecture.
排查很久还是不知道原因,最后问了一个大牛,他说是libzzip.a不是iphone armv6.7的使用的,要编译一个armv 6的,所以着手开始编译,困难重重.本身touchxml里面就有shell脚本,但直接编译报错:在target下面找到run script这个文件,打开,代码是这样的:
if [ -d "$SRCROOT/DONTBUILD"]; then
exit 0
fi
if [ $PLATFORM_NAME == "iphonesimulator" ]; then
TARGET=device
fi
echo $TARGET
OUTPUT_DIR="$SRCROOT/Externals/zzip/Output"
#rm -rf "$OUTPUT_DIR/*"
cd "$SRCROOT/Externals/zzip/zziplib"
$SRCROOT/Scripts/build_for_iphoneos.sh -p "$OUTPUT_DIR" "$TARGET" 2> /dev/null |
直接在bash shell中跑这段代码是跑不了的,会有一堆的错误,为把这些错去掉,就尽量简化它(a.sh)
SRCROOT="your project absolute path"
TARGET=device
OUTPUT_DIR="$SRCROOT/Externals/zzip/Output"
cd "$SRCROOT/Externals/zzip/zziplib"
$SRCROOT/Scripts/build_for_iphoneos.sh -p "$OUTPUT_DIR" "$TARGET" 2> /dev/null |
这样简化后,这个shell是可以跑出,但在这里面调用的那个build_for_iphoneos.sh这个脚本无法产生结果,也还要修改这个sh.
修改后如下:
|
# Disallow undefined variables
set -u
default_gcc_version=4.2
//iphone 3.2之前是3.1.2
default_iphoneos_version=3.2
//用与你电脑相对应的系统版本
default_macos_version=10.6
GCC_VERSION="${GCC_VERSION:-$default_gcc_version}"
export IPHONEOS_DEPLOYMENT_TARGET="${IPHONEOS_DEPLOYMENT_TARGET:-$default_iphoneos_version}"
export MACOSX_DEPLOYMENT_TARGET="${MACOSX_DEPLOYMENT_TARGET:-$default_macos_version}"
usage ()
{
cat >&2 << EOF
Usage: ${0##*/} [-ht] [-p prefix] target [configure_args]
-h Print help message
-p Installation prefix (default: \$HOME/Developer/Platforms/...)
-t Use 16-bit Thumb instruction set (instead of 32-bit ARM)
The target must be "device" or "simulator". Any additional arguments
are passed to configure.
The following environment variables affect the build process:
GCC_VERSION (default: $default_gcc_version)
IPHONEOS_DEPLOYMENT_TARGET (default: $default_iphoneos_version)
MACOSX_DEPLOYMENT_TARGET (default: $default_macos_version)
EOF
}
while getopts ":hp:t" opt; do
case $opt in
h ) usage ; exit 0 ;;
p ) prefix="$OPTARG" ;;
t ) thumb_opt=thumb ;;
\? ) usage ; exit 2 ;;
esac
done
shift $(( $OPTIND - 1 ))
if (( $# < 1 )); then
usage
exit 2
fi
target=$1
shift
case $target in
device )
#用armv7,之前是armv6
arch=armv7
platform=iPhoneOS
extra_cflags="-m${thumb_opt:-no-thumb} -mthumb-interwork"
;;
simulator )
arch=i386
platform=iPhoneSimulator
extra_cflags="-D__IPHONE_OS_VERSION_MIN_REQUIRED=${IPHONEOS_DEPLOYMENT_TARGET%%.*}0000"
;;
* )
usage
exit 2
esac
platform_dir="/Developer/Platforms/${platform}.platform/Developer"
platform_bin_dir="${platform_dir}/usr/bin"
platform_sdk_dir="${platform_dir}/SDKs/${platform}${IPHONEOS_DEPLOYMENT_TARGET}.sdk"
prefix="${prefix:-${HOME}${platform_sdk_dir}}"
export CC="${platform_bin_dir}/gcc-${GCC_VERSION}"
export CFLAGS="-arch ${arch} -pipe -Os -gdwarf-2 -isysroot ${platform_sdk_dir} ${extra_cflags}"
export LDFLAGS="-arch ${arch} -isysroot ${platform_sdk_dir}"
export CXX="${platform_bin_dir}/g++-${GCC_VERSION}"
export CXXFLAGS="${CFLAGS}"
export CPP="/Developer/usr/bin/cpp-${GCC_VERSION}"
export CXXCPP="${CPP}"
./configure \
--prefix="${prefix}" \
--host="${arch}-apple-darwin" \
--disable-shared \
--enable-static \
"$@" || exit
make install || exit
cat >&2 << EOF
Build succeeded! Files were installed in
$prefix
EOF
|
这时开始./a.sh时候就能正确无误的产生libzzip.a的iphone版本.