2014-01-21 55 views
1

基于How can I compile lame as static library...?,我已经用在MacBook Pro上这个脚本编译跛脚:如何解决“未定义的符号init_xrpow_core_sse”链接蹩脚的MP3编码器到iOS应用程序?

mkdir -p build 
rm -rf build/* #*/ 


function build_lame() 
{ 
    make distclean 

    ./configure \ 
     CFLAGS="-isysroot /Applications/Xcode.app/Contents/Developer/Platforms/${SDK}.platform/Developer/SDKs/$SDK$SDK_VERSION.sdk" \ 
     CC="/Applications/Xcode.app/Contents/Developer/usr/bin/gcc -arch $PLATFORM -miphoneos-version-min=7.0" \ 
     --prefix="/Users/$USER/Desktop/$PROJECTNAME" \ 
     --host="arm-apple-darwin9" \ 
     --disable-shared \ 
     --enable-static \ 
     --disable-frontend \ 

    make 
    cp "$PROJECTNAME/.libs/$PROJECTNAME.a" "build/$PROJECTNAME-$PLATFORM.a" 
} 


PROJECTNAME=libmp3lame 
SDK_VERSION=7.0 


SDK="iPhoneSimulator" 
PLATFORM="i386" 
build_lame 

SDK="iPhoneOS" 
PLATFORM="armv7" 
build_lame 

SDK="iPhoneOS" 
PLATFORM="armv7s" 
build_lame 


lipo -create build/$PROJECTNAME-* -output build/$PROJECTNAME.a 

然后我加入生成libmp3lame.a到iPhone项目在Xcode 5.0.2。当为iOS设备构建时,它工作正常。我的问题在为模拟器构建时开始。当这样做,我得到以下链接器错误:

Undefined symbols for architecture i386: 
    "_init_xrpow_core_sse", referenced from: 
     _init_xrpow_core_init in libmp3lame.a(quantize.o) 
ld: symbol(s) not found for architecture i386 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 

为什么会发生此错误,以及如何解决它?

下面是quantize.c代码段从跛脚库:

static void 
init_xrpow_core_c(gr_info * const cod_info, FLOAT xrpow[576], int upper, FLOAT * sum) 
{ 
    // here, the initialization of xrpow is done in normal c code (i've cut that out to keep it small) 
} 

void 
init_xrpow_core_init(lame_internal_flags * const gfc) 
{ 
    gfc->init_xrpow_core = init_xrpow_core_c; 

#if defined(HAVE_XMMINTRIN_H) 
    if (gfc->CPU_features.SSE) 
     gfc->init_xrpow_core = init_xrpow_core_sse; 
#endif 
#ifndef HAVE_NASM 
#ifdef MIN_ARCH_SSE 
    gfc->init_xrpow_core = init_xrpow_core_sse; 
#endif 
#endif 
} 

回答

1

的问题是在--host参数configure。它需要根据要运行模拟器的机器进行更改。就我而言,这是一台从2009年中旬开始运行Mac OS X 10.8.5的MacBook Pro。

uname -a报道:

Darwin <my computer name>.local 12.5.0 Darwin Kernel Version 12.5.0: Sun Sep 29 13:33:47 PDT 2013; root:xnu-2050.48.12~1/RELEASE_X86_64 x86_64 

所以我疯狂地猜到是--host参数configure此环境中,模拟器运行时,需要设置为i686-apple-darwin12.5.0。猜测是对的。我的构建脚本现在看起来像这样:

mkdir -p build 
rm -rf build/* #*/ 


function build_lame() 
{ 
    make distclean 

    ./configure \ 
     CFLAGS="-isysroot /Applications/Xcode.app/Contents/Developer/Platforms/${SDK}.platform/Developer/SDKs/$SDK$SDK_VERSION.sdk" \ 
     CC="/Applications/Xcode.app/Contents/Developer/usr/bin/gcc -arch $PLATFORM -miphoneos-version-min=7.0" \ 
     --prefix="/Users/$USER/Desktop/$PROJECTNAME" \ 
     --host="$HOST" \ 
     --disable-shared \ 
     --enable-static \ 
     --disable-frontend \ 

    make 
    cp "$PROJECTNAME/.libs/$PROJECTNAME.a" "build/$PROJECTNAME-$PLATFORM.a" 
} 


PROJECTNAME=libmp3lame 
SDK_VERSION=7.0 


SDK="iPhoneSimulator" 
HOST="i686-apple-darwin12.5.0" 
PLATFORM="i686" 
build_lame 

SDK="iPhoneOS" 
HOST="arm-apple-darwin9" 
PLATFORM="armv7" 
build_lame 

SDK="iPhoneOS" 
HOST="arm-apple-darwin9" 
PLATFORM="armv7s" 
build_lame 


lipo -create build/$PROJECTNAME-* -output build/$PROJECTNAME.a 

这适用于在Xcode中为Simulator构建模型时。

相关问题