2012-07-29 109 views
3

我一直在尝试使用Mountain Lion中的iOS 5.1 SDK为armv6,armv6和i386交叉编译libogg。 Libogg使用autoconf,而且我也遇到了与其他一些库类似的问题。我从here拿起一个整洁的小交叉编译脚本。我必须稍微更新一下才能找到SDK的位置。交叉编译iOS的libogg

GLOBAL_OUTDIR="`pwd`/dependencies" 
mkdir -p $GLOBAL_OUTDIR/include $GLOBAL_OUTDIR/lib 
OUTDIR="./outdir" 
OGG_LIB="`pwd`/libogg-1.3.0" 

IOS_BASE_SDK="5.1" 
IOS_DEPLOY_TGT="3.2" 

setenv_all() 
{ 
# Add internal libs 
export CFLAGS="$CFLAGS -I$GLOBAL_OUTDIR/include -L$GLOBAL_OUTDIR/lib" 

export CXX="$DEVROOT/usr/bin/llvm-g++-4.2" 
    export CC="$DEVROOT/usr/bin/llvm-gcc-4.2" 

export LD=$DEVROOT/usr/bin/ld 
export AR=$DEVROOT/usr/bin/ar 
export AS=$DEVROOT/usr/bin/as 
export NM=$DEVROOT/usr/bin/nm 
export RANLIB=$DEVROOT/usr/bin/ranlib 
export LDFLAGS="-L$SDKROOT/usr/lib/" 

export CPPFLAGS=$CFLAGS 
export CXXFLAGS=$CFLAGS 
} 

setenv_arm6() 
{ 
unset DEVROOT SDKROOT CFLAGS CC LD CPP CXX AR AS NM CXXCPP RANLIB LDFLAGS CPPFLAGS CXXFLAGS 

export DEVROOT=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer 
export SDKROOT=$DEVROOT/SDKs/iPhoneOS$IOS_BASE_SDK.sdk 

export CFLAGS="-arch armv6 -pipe -no-cpp-precomp -isysroot $SDKROOT -miphoneos-version-min=$IOS_DEPLOY_TGT -I$SDKROOT/usr/include/" 

setenv_all 
} 

setenv_arm7() 
{ 
unset DEVROOT SDKROOT CFLAGS CC LD CPP CXX AR AS NM CXXCPP RANLIB LDFLAGS CPPFLAGS CXXFLAGS 

export DEVROOT=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer 
export SDKROOT=$DEVROOT/SDKs/iPhoneOS$IOS_BASE_SDK.sdk 

export CFLAGS="-arch armv7 -pipe -no-cpp-precomp -isysroot $SDKROOT -miphoneos-version-min=$IOS_DEPLOY_TGT -I$SDKROOT/usr/include/" 

setenv_all 
} 

setenv_i386() 
{ 
unset DEVROOT SDKROOT CFLAGS CC LD CPP CXX AR AS NM CXXCPP RANLIB LDFLAGS CPPFLAGS CXXFLAGS 

export DEVROOT=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer 
export SDKROOT=$DEVROOT/SDKs/iPhoneSimulator$IOS_BASE_SDK.sdk 

export CFLAGS="-arch i386 -pipe -no-cpp-precomp -isysroot $SDKROOT -miphoneos-version-min=$IOS_DEPLOY_TGT" 

setenv_all 
} 

create_outdir_lipo() 
{ 
for lib_i386 in `find $LOCAL_OUTDIR/i386 -name "lib*\.a"`; do 
    lib_arm6=`echo $lib_i386 | sed "s/i386/arm6/g"` 
    lib_arm7=`echo $lib_i386 | sed "s/i386/arm7/g"` 
    lib=`echo $lib_i386 | sed "s/i386\///g"` 
    lipo -arch armv6 $lib_arm6 -arch armv7 $lib_arm7 -arch i386 $lib_i386 -create -output $lib 
done 
} 

merge_libfiles() 
{ 
DIR=$1 
LIBNAME=$2 

cd $DIR 
for i in `find . -name "lib*.a"`; do 
    $AR -x $i 
done 
$AR -r $LIBNAME *.o 
rm -rf *.o __* 
cd - 
} 

然后建立ogg库。

## libogg 
cd $OGG_LIB 
rm -rf $OUTPUT_DIR 
mkdir -p $OUTDIR/arm6 $OUTDIR/arm7 $OUTDIR/i386 

## Build for armv6 
make clean 2> /dev/null 
make distclean 2> /dev/null 
setenv_arm6 
./configure --host=arm-apple-darwin6 --enable-shared=no 
make 
cp /src/.libs/libogg.a $OUTDIR/arm6 

## Build for armv7 

make clean 2> /dev/null 
make distclean 2> /dev/null 
setenv_arm7 
./configure --host=arm-apple-darwin7 --enable-shared=no 
make 
cp src/.libs/libogg.a $OUTDIR/arm7 

## Build for iPhone simulator 
make clean 2> /dev/null 
setenv_i386 
./configure 
make -j4 
cp src/.libs/libogg.a $OUTDIR/i386 

## Stich it altogether in a fat .a file. 
create_outdir_lipo 

无论如何,建筑的ARMv6和ARMv7时,发现配置编译器的和SDK的还好,并编译阶段熄灭顺利。但他们都没有联系。 armv7构建吐出了错误。

ld: in section __TEXT,__text reloc 1: unknown relocation type 9 for architecture armv7 collect2: ld returned 1 exit status 

当我与脂测试输出二进制:

$ lipo -info libogg.a 
lipo: archive with no architecture specification: libogg.a (can't determine architecture for it) 

奇怪的是I386似乎完美地编译,(我已经尝试过在模拟器和所有是好的)。

关于我能做些什么来尝试解决这个问题,或者至少我应该开始寻找的建议。对于大量的代码转储抱歉,谢谢。

+0

您可以手动为每个发送到'lipo'的库设置'-arch',这是否适合您? – 2012-07-29 17:11:12

回答

4

我能通过将编译时的优化级别设置为-O3而不是-O4来解决此问题。与-O4文件输出似乎不可识别lipo(甚至file报告它们为data而不是Mach-O object arm)。

更新:似乎不少人在编译Ogg Vorbis时遇到困难。我已经使我的构建可用。请参阅:Precompiled Ogg Vorbis Libraries for iOS

+0

我很惊讶你解决了这个问题。我最初放弃了使用构建脚本来处理libogg,而是修改了macosx xcode文件以跨iOS进行编译。但这是一个更好的解决方案,现在我可以将libogg集成到我的一步构建过程中。非常感谢。 – 2012-08-02 13:10:22

+0

我还发现有一些自检在交叉编译时没有被禁用,所以我不得不禁用它们。你也遇到过这个问题吗? (也就是说,我必须修补Makefile.am并重新配置)。 – idz 2012-08-02 17:22:39