2013-05-07 1 views
2

Моего RubyMotion проект строит хорошо, но терпит неудачу на этапе связующего, в частности, при связывании с GoogleAdMobAds, с ошибкой «дубликат символа»:Повторяющиеся ошибки символа при компоновке AdMob SDK в RubyMotion

Compile ./app/controllers/blahblah_view_controller.rb 
# compiling here, everything is awesome, until...  
Create ./build/iPhoneOS-6.1-Development/App.app 
Link ./build/iPhoneOS-6.1-Development/App.app/APP 
duplicate symbol _GAD_MD5 in: 
    /Users/edd/Projects/ProjectName/vendor/GoogleAdMobAdsSDK/libGoogleAdMobAds.a(md5.o) 
    /Users/edd/Projects/ProjectName/vendor/GoogleAdMobAdsSDK/libGoogleAdMobAds.a(gad_md5.o) 
ld: 1 duplicate symbol for architecture armv7s 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 
rake aborted! 
Command failed with status (1): [/Applications/Xcode.app/Contents/Developer...] 
    /Library/RubyMotion/lib/motion/project/builder.rb:393:in `build' 
    /Library/RubyMotion/lib/motion/project/app.rb:72:in `build' 
    /Library/RubyMotion/lib/motion/project.rb:56:in `block (2 levels) in <top (required)>' 
Tasks: TOP => build:device 
(See full trace by running task with --trace) 

Стоит отметить это происходит только при строительстве для устройства. Он отлично работает в симуляторе. Соответствующая Rakefile линия:

app.vendor_project('vendor/GoogleAdMobAdsSDK', :static) 

Эта проблема также возникает при включении в SDK через CocoaPods.

Любые предложения?

ответ

4

После просмотра форумов поддержки для AdMob Google я обнаружил, что this thread в основном говорит о проблемах, возникающих при связывании с SDK AdMob при передаче флага -force_load в ld. Никто не вдавается в подробности, кроме всего прочего.

Сидя источник, я также нашел недокументированные опции конфигурации для vendor_project RubyMotion, что может сделать его вызов ld использования просто -ObjC вместо -force_load для vendored кода, и, по-видимому, это то, что нужно сделать это собрать для меня:

app.vendor_project('vendor/GoogleAdMobAdsSDK', :static, force_load: false) 

Voila. Я, к сожалению, не могу объяснить, почему это происходит только при создании устройства (возможно, что-то связано с -force_load, сочетающимся с арками, где-то глубоко в RubyMotion), поэтому, если кто-то может предложить любую мудрость, пожалуйста, оставьте здесь комментарий.

+1

force_load заставляет компилятор включать каждый отдельный объект из указанной библиотеки. AdModSDK имеет дублированный объект, который конфликтует с системной библиотекой (возможно), и компилятор указал на это. Если вы не используете force_load, категории могут не загружаться из AdModSDK. Ваше приложение будет сбой при использовании AdModSDK. Флаг force_load работает только на 64-битных OSX или iOS-приложениях, поэтому он работает на симуляторе (32 бита). – fbernardo

+0

Дополнительная информация: http://developer.apple.com/library/mac/#qa/qa1490/_index.html – fbernardo

+0

Понял. Благодарю. :) –

0

Если вам действительно нужно использовать -force_load (слишком много конфликтов в проекте с помощью -ObjC, например), вы можете сделать следующее.

  • Получить гекса редактор (0xED, например)
  • Открыть статический Lib с ним
  • Перейти к последней строке
  • Изменить имя константы на что-то другое
  • сохранить
  • сделано!