iphone - 如何将lame编译为iPhone的armv6和armv7的静态库(.a)?

标签 iphone static mp3 lame

LAME(http://lame.sourceforge.net/)是一个用c语言编写的库。它可以将 PCM 声音文件转换为 MP3 文件。我用它在 iPhone 上将声音文件转换为 MP3 文件。源PCM声音文件由麦克风录制。

为了将 LAME 包含到我的 XCode 项目中,我需要将 LAME 编译为 3 个静态库(.a),分别用于 i386(IOS 模拟器)、armv6 和 armv7。

经过一番查找,我成功编译了一个i368版本(iOS模拟器)的静态库。这是命令:

./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

问题是我无法编译armv6和armv7。我已经尝试过这个命令,但它报告错误。有没有人有解决办法?

./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

错误是:

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

当我安装 ncurses 时,它报告了以下内容:

../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’

有人可以给我一种方法将LAME编译为armv6和armv7的静态库(.a)吗?

最佳答案

您缺少一些步骤。首先,您根本不想构建前端,因为无论如何您都只能使用 LAME 作为库。您还必须静态构建该库,否则您将无法将其构建到您的项目中。

基本上,您必须设置源代码树并编译四次,一次用于模拟器(i686)、iPhone(armv6)、iPad(armv7)和iPhone 5(armv7s),然后将.a文件一起脂化为通用图书馆。当您编译项目的其余部分时,Xcode 链接器将为您整理所有其他内容。

我使用这个 shell 脚本构建了一个通用的 libmp3lame.a 文件。请注意,这使用 Xcode 4.3 路径和 iOS 5.1 编译器。

#!/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

从 ./build 中获取 libmp3lame.a 文件以及 include 目录中的 lame.h 文件,并将它们放入您的 Xcode 项目中,您应该准备好在模拟器或真实设备中使用 lame。

关于iphone - 如何将lame编译为iPhone的armv6和armv7的静态库(.a)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9207063/

相关文章:

iphone - MVC 如何正确获取自定义单元格中控件的值?

iphone - MPMoviePlayer 控制风格

iphone - 将 UIImage 放入 UIButton 的简单方法

php - 公共(public)静态变量值

android - 推荐的 Android 音乐格式 - mp3、ogg 还是其他?

firefox - 为什么 html 5 音频标签在 FF 上不起作用?

iphone - 过期的 [UIImage imageNamed :] object?

dynamic - 动态类型语言是如何在静态类型语言之上实现的?

c - 访问和修改局部静态变量

java - PlayN mp3 支持 UnsupportedAudioFileException