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

3

14

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?

Mohn answered 9/2, 2012 at 7:39 Comment(0)
G
14

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.

Gyrostat answered 4/6, 2012 at 4:40 Comment(7)
Man, your answer is a life saver :))) Thanks a lot!Boletus
@Gyrostat I am using this exact script except I have changed the sdk version to 6.0 and I get the following error at the very end: lipo: build/libmp3lame-armv6.a and build/libmp3lame-armv7.a have the same architectures (armv7) and can't be in the same fat output fileCentri
@Gyrostat also note that to support iPhone5 you need to add PLATFORM="armv7s" build_lameCentri
@Centri I haven't tested this under SDK 6.0. My guess would be Apple changed something with the way v6 and v7 binaries are compiled but off the top of my head I'm not sure.Gyrostat
I opted to stop supporting armv6 because I don't support the armv6 devices anyway. ARMv6 = iPhone 2G/3G, iPod 1G/2GCentri
@Boletus Is there any chance, if can you share static library .a file you created ?Arcadian
@Gyrostat Hi! Thanks for your script, that worked like a chame. I'm trying to use Lame, with this code: tekritisoftware.com/convert-caf-to-mp3-in-iOS that seems OK, I have a crash on line read = fread(pcm_buffer, 2*sizeof(short int), PCM_SIZE, pcm); any ideas about how to solve it? Thank you!Packton
H
7

For Xcode 6.1, iOS SDK 8.1, I use below shell script:

Support armv7, arm64, i686 and x86_64

#!/bin/bash

DEVELOPER=`xcode-select -print-path`

SDK_VERSION="8.1"

LAMEDIR="/Users/zuyuanzhou/Downloads/lame-3.99.5"

mkdir build

function build_lame()
{
make distclean

./configure \
CFLAGS="-isysroot ${DEVELOPER}/Platforms/${SDK}.platform/Developer/SDKs/${SDK}${SDK_VERSION}.sdk" \
CC="${DEVELOPER}/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -arch ${PLATFORM} -miphoneos-version-min=7.0 " \
CPP="${DEVELOPER}/Toolchains/XcodeDefault.xctoolchain/usr/bin/cpp" \
--prefix="$LAMEDIR" \
--host="$HOST" \
--disable-shared \
--enable-static \
--disable-decoder \
--disable-frontend

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


PLATFORM="i686"
SDK="iPhoneSimulator"
HOST="i686-apple-darwin14.1.0"
build_lame

PLATFORM="x86_64"
build_lame

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

PLATFORM="arm64"
build_lame

lipo -create build/* -output build/libmp3lame.a
Hooker answered 2/12, 2014 at 8:23 Comment(2)
I am getting error while creating build file. Getting error on line 13 of this script. Can you please provide all LAME builds then it would be helpful. ThanksSilva
Some .sh files are not found. I think something is wrong with path.Silva
I
4

Thanks @mcrute for his great answer, and XCode 5 requirement update I have updated script. Hope it useful for new users.

NOTE: Don't forget to update SDK_VERSION based on your system installation

#!/bin/bash

DEVELOPER=`xcode-select -print-path`

SDK_VERSION="7.1"

mkdir build

function build_lame()
{
    make distclean

    ./configure \
        CFLAGS="-isysroot ${DEVELOPER}/Platforms/${SDK}.platform/Developer/SDKs/${SDK}${SDK_VERSION}.sdk" \
        CC="${DEVELOPER}/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -arch ${PLATFORM} -miphoneos-version-min=7.0 " \
        --prefix=/Users/mcrute/Desktop/lame \
        --host="arm-apple-darwin9" \
        --disable-shared \
        --enable-static \
        --disable-decoder \
        --disable-frontend

    make -j4
    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
Inhabiter answered 9/6, 2014 at 9:43 Comment(3)
Roozbeh, after running script I've got this error: configure: error: in `/Users/ivan/Desktop/lame-3.99.5': configure: error: C preprocessor "/lib/cpp" fails sanity check . Have you got any ideas how to solve it?Privilege
You probably using different environment. I was using OSX 10.8 at the time. Do you know where it is failing? In configure or make ?Inhabiter
Hi @Ivan Kozlov, you can try to add "CPP="${DEVELOPER}/Toolchains/XcodeDefault.xctoolchain/usr/bin/cpp" see my answer below.Hooker

© 2022 - 2024 — McMap. All rights reserved.