How can I compile lame as static library(.a) for armv6 and armv7 of iPhone?

rexshi picture rexshi · Feb 9, 2012 · Viewed 8k times · Source

LAME(http://lame.sourceforge.net/) is a library written in c language. It can convert PCM sound files to MP3 files. I use it to convert sound files to MP3 files on iPhone. The source PCM sound files is recorded by microphone.

In order to include the LAME into my XCode Project, I need to compile the LAME to 3 static libraries(.a), for i386(IOS Simulator), armv6 and armv7.

After a lot of search, I have complied a static library for i368 version(iOS Simulator) successfully. Here is commands:

./configure \
    CFLAGS="-isysroot  /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator5.0.sdk" \
    CC="/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/gcc -arch i386" \
    --prefix=/Volumes/Data/test/i386 \
    --host="arm-apple-darwin9"

make && make install

The problem is I can not compile for armv6 and armv7. I have tried this commands but it report an error. Is there anybody have solutions?

./configure \
    CFLAGS="-isysroot /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk" \
    CC="/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc -arch armv6" \
    --prefix=/Volumes/Data/test/arm6 \
    --host="arm-apple-darwin9"

make && make install

The error is:

console.c:25:21: error: curses.h: No such file or directory
console.c:27:20: error: term.h: No such file or directory
console.c: In function ‘get_termcap_string’:
console.c:92: warning: implicit declaration of function ‘tgetstr’
console.c:92: warning: assignment makes pointer from integer without a cast
console.c: In function ‘get_termcap_number’:
console.c:102: warning: implicit declaration of function ‘tgetnum’
console.c: In function ‘apply_termcap_settings’:
console.c:115: warning: implicit declaration of function ‘tgetent’
make[2]: *** [console.o] Error 1
make[1]: *** [all-recursive] Error 1
make: *** [all] Error 2

When I install ncurses, It reported this:

../curses.h:60:25: error: ncurses_dll.h: No such file or directory
In file included from console.c:25:
../curses.h:250: warning: return type defaults to ‘int’
../curses.h: In function ‘NCURSES_EXPORT_VAR’:
../curses.h:250: error: expected declaration specifiers before ‘acs_map’
../curses.h:340: error: storage class specified for parameter ‘SCREEN’
../curses.h:341: error: storage class specified for parameter ‘WINDOW’
../curses.h:343: error: storage class specified for parameter ‘attr_t’
../curses.h:388: warning: empty declaration
../curses.h:401: error: expected specifier-qualifier-list before ‘attr_t’
../curses.h:443: warning: empty declaration
../curses.h:542: error: storage class specified for parameter ‘NCURSES_OUTC’
../curses.h:551: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘addch’
../curses.h:552: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘addchnstr’
../curses.h:553: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘addchstr’
../curses.h:554: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘addnstr’

Is there somebody can give me a way to compile LAME to static library(.a) for the armv6 and armv7?

Answer

mcrute picture mcrute · Jun 4, 2012

You're missing a few steps. First of all you don't want to build the frontend at all since you'll only be able to use LAME as a library anyhow. You also have to build the library statically otherwise you won't be able to build it into your project.

Basically, you have to setup the source tree and compile it four times, once for the simulator (i686), iPhone (armv6), iPad (armv7) and iPhone 5 (armv7s) then lipo the .a files together into a universal library. The Xcode linker will sort everything else out for you when you compile the rest of your project.

I used this shell script to build a universal libmp3lame.a file. Note this uses Xcode 4.3 paths and iOS 5.1 compilers.

#!/bin/bash

SDK_VERSION="5.1"

mkdir 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/Platforms/${SDK}.platform/Developer/usr/bin/gcc -arch ${PLATFORM}" \
        --prefix=/Users/mcrute/Desktop/lame \
        --host="arm-apple-darwin9" \
        --disable-shared \
        --enable-static \
        --disable-decoder \
        --disable-frontend

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

PLATFORM="i686"
SDK="iPhoneSimulator"
build_lame

PLATFORM="armv6"
SDK="iPhoneOS"
build_lame

PLATFORM="armv7"
build_lame

PLATFORM="armv7s"
build_lame

lipo -create build/* -output build/libmp3lame.a

Take the libmp3lame.a file from ./build along with the lame.h file from the include directory and drop them in your Xcode project and you should be ready to use lame in either the simulator or a real device.