ошибка ссылки Xcode libx264.a ARM

Я пытаюсь собрать libx264.a для работы на моем iphone 4s (под управлением iOS 6.1.3)

Я создаю его с помощью приложения терминала MACOSX 10.9:

CC=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang ./configure 
--host=arm-apple-darwin 
--sysroot=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.0.sdk 
--prefix=armv7 
--extra-cflags='-no-integrated-as -arch armv7' 
--extra-ldflags="-L/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.0.sdk/usr/lib/system -arch armv7" 
--enable-pic --enable-static

Что дает мне вывод:

platform:      ARM
system:        MACOSX
cli:           yes
libx264:       internal
shared:        no
static:        yes
asm:           yes
interlaced:    yes
avs:           avxsynth
lavf:          no
ffms:          no
mp4:           no
gpl:           yes
thread:        posix
opencl:        yes
filters:       crop select_every 
debug:         no
gprof:         no
strip:         no
PIC:           yes
bit depth:     8
chroma format: all

Затем я запускаю make, и он создает архив libx264.a.

Все идет нормально.

В моем приложении Xcode (версия 5.0.2 (5A3005)) я установил:

1) Настройки сборки -> Путь поиска заголовков -> родительский каталог x264 (../x264)
2) Этапы сборки -> Связать библиотеку с двоичными файлами -> Добавить другое... ( ../x264/libx264.a )
3) Настройки сборки -> Другие флаги компоновщика: -ObjC

В моем AppDelegate.mm:

#import "AppDelegate.h"
#import "x264.h"

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application 
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{    
    x264_param_t x264param;
    x264_param_default(&x264param);

    // Override point for customization after application launch.
    return YES;
}

...

Когда я пытаюсь запустить его на устройстве, я получаю сообщение об ошибке:

Undefined symbols for architecture armv7:
  "x264_param_default(x264_param_t*)", referenced from:
  -[AppDelegate application:didFinishLaunchingWithOptions:] in AppDelegate.o
ld: symbol(s) not found for architecture armv7
clang: error: linker command failed with exit code 1 
(use -v to see invocation)

Вот команда, вызываемая xcode:

Ld /Users/danieldantas/Library/Developer/Xcode/DerivedData/testingCpp-bvawshyhjcybwvadwwwjqxuomjts/Build/Products/Debug-iphoneos/testingCpp.app/testingCpp normal armv7
cd /Users/danieldantas/Desktop/projects/testingCpp
setenv IPHONEOS_DEPLOYMENT_TARGET 6.0
setenv PATH "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin"
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++ -arch armv7 -isysroot 
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.0.sdk 
-L/Users/danieldantas/Library/Developer/Xcode/DerivedData/testingCpp-bvawshyhjcybwvadwwwjqxuomjts/Build/Products/Debug-iphoneos 
-L/Users/danieldantas/Desktop/projects/testingCpp -L/Users/danieldantas/Desktop/projects/x264 
-F/Users/danieldantas/Library/Developer/Xcode/DerivedData/testingCpp-bvawshyhjcybwvadwwwjqxuomjts/Build/Products/Debug-iphoneos 
-filelist /Users/danieldantas/Library/Developer/Xcode/DerivedData/testingCpp-bvawshyhjcybwvadwwwjqxuomjts/Build/Intermediates/testingCpp.build/Debug-iphoneos/testingCpp.build/Objects-normal/armv7/testingCpp.LinkFileList 
-dead_strip -ObjC -stdlib=libc++ -fobjc-arc -fobjc-link-runtime -miphoneos-version-min=6.0 -lx264 -framework CoreGraphics -framework UIKit -framework Foundation -Xlinker -dependency_info -Xlinker 
/Users/danieldantas/Library/Developer/Xcode/DerivedData/testingCpp-bvawshyhjcybwvadwwwjqxuomjts/Build/Intermediates/testingCpp.build/Debug-iphoneos/testingCpp.build/Objects-normal/armv7/testingCpp_dependency_info.dat -o 
/Users/danieldantas/Library/Developer/Xcode/DerivedData/testingCpp-bvawshyhjcybwvadwwwjqxuomjts/Build/Products/Debug-iphoneos/testingCpp.app/testingCpp

Любая идея, как это исправить?

Спасибо


person user1558688    schedule 19.11.2013    source источник
comment
Можете ли вы запустить lipo -info в созданной библиотеке? Похоже, что он не скомпилировался для ARMv7.   -  person Richard J. Ross III    schedule 19.11.2013
comment
lipo -info libx264.a входной файл libx264.a не является толстым файлом Нежирный файл: libx264.a имеет архитектуру: armv7   -  person user1558688    schedule 19.11.2013
comment
Если вы запустите nm {library} | grep param_default, он появится? Вполне возможно, что ваша конфигурация не позволяет использовать эту функцию.   -  person Richard J. Ross III    schedule 19.11.2013
comment
нм libx264.a | grep x264_param_default 00000000 T _x264_param_default 000002c0 T _x264_param_default_preset   -  person user1558688    schedule 19.11.2013


Ответы (1)


Только что нашел решение:

Проблема заключалась в отсутствии extern "C" вокруг оператора импорта:

Исправленная версия:

#import "AppDelegate.h"
extern "C" {
    #import "x264.h"
}

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application 
didFinishLaunchingWithOptions: (NSDictionary *)launchOptions
{        
    x264_param_t x264param;
    x264_param_default(&x264param);

    // Override point for customization after application launch.
    return YES;
}
person user1558688    schedule 19.11.2013