Как я могу скомпилировать lame как статическую библиотеку (.a) для armv6 и armv7 iPhone? - PullRequest
13 голосов
/ 09 февраля 2012

LAME (http://lame.sourceforge.net/) - это библиотека, написанная на языке c. Она может конвертировать звуковые файлы PCM в файлы MP3. Я использую ее для преобразования звуковых файлов в файлы MP3 на iPhone. Исходные звуковые файлы PCM записываются с помощью микрофона.

Чтобы включить LAME в мой проект XCode, мне нужно скомпилировать LAME в 3 статические библиотеки (.a) для i386 (IOS Simulator), armv6 и armv7.

Послемного поиска, я успешно собрал статическую библиотеку для версии i368 (iOS Simulator). Вот команды:

./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 в статическую библиотеку (.a) для armv6 и armv7?

Ответы [ 3 ]

13 голосов
/ 04 июня 2012

Вам не хватает нескольких шагов.Во-первых, вы вообще не хотите создавать интерфейс, так как вы все равно сможете использовать LAME в качестве библиотеки.Вы также должны построить библиотеку статически, иначе вы не сможете встроить ее в свой проект.

По сути, вам нужно настроить исходное дерево и скомпилировать его четыре раза, один раз для симулятора (i686)Затем iPhone (armv6), iPad (armv7) и iPhone 5 (armv7s) объединяют файлы .a в универсальную библиотеку.Компоновщик XCode будет разбирать все остальное для вас, когда вы компилируете остальную часть вашего проекта.

Я использовал этот сценарий оболочки для создания универсального файла 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

Возьмите файл libmp3lame.a из ./build вместе с файлом lame.h из каталога include и поместите их в свой проект Xcode, и выдолжен быть готов использовать lame в симуляторе или реальном устройстве.

7 голосов
/ 02 декабря 2014

Для Xcode 6.1, iOS SDK 8.1, я использую скрипт ниже:

Поддержка armv7, arm64, i686 и 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
4 голосов
/ 09 июня 2014

Спасибо @mcrute за отличный ответ и Требование об обновлении XCode 5 Я обновил скрипт. Надеюсь, что это полезно для новых пользователей.

ПРИМЕЧАНИЕ. Не забудьте обновить SDK_VERSION в зависимости от установки вашей системы

#!/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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...