2012-07-29 152 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