2016-10-03 3 views
1

У меня есть проект в witch Я использую 2 контейнера, частный, который использует SQLCipher и Google/Analytics, который использует системы sqlite3 (-l "sqlite3").Значок Xcode 8 не найден связывание sqlite3

Когда я строю свой проект с Xcode 7, все работает правильно, но когда я строю с Xcode 8 аварий приложений при попытке открыть БД SQLite со следующей причине:

dlopen(/usr/lib/libsqlite3.dylib, 0x00000001) 
dlopen(/usr/lib/libsqlite3.dylib) ==> 0x1feec4f0 
dyld: lazy symbol binding failed: Symbol not found: _sqlite3_key 
Referenced from: /var/containers/Bundle/Application/524A1D1F-CC6A-4F7C-B86F-CC65EAF17BD5/MyApp.app/MyApp 
Expected in: /usr/lib/libsqlite3.dylib 

Испытано:

|   | iOS 8 | iOS 9 | iOS 10 | 
| Xcode 7 | OK | OK | OK | 
| Xcode 8 | CRASH | CRASH | * | 

* app didn't crash but could not open db 

Что изменил Xcode 8? (https://developer.apple.com/library/content/releasenotes/DeveloperTools/RN-Xcode/Introduction.html)
Любые предложения по устранению этого?

+0

[Этот вопрос] (http://stackoverflow.com/questions/6355893/implicit-declaration-of-function-sqlite3-key) указывает, что 'sqlite3_key()' не входит в iOS версия sqlite3. Также вы можете отключить ленивую загрузку этой библиотеки? – Droppy

+0

@ Droppy, как бы вы посоветовали отключить ленивую загрузку? – Daniel

+0

@ Даниэль Я столкнулся с подобной проблемой, не могли бы вы предложить свое решение! – CoDe

ответ

1

К сожалению, одновременное использование блоков, зависящих от sqlite3 и SQLCipher, на самом деле не поддерживается сценарием SQLCipher. Вы можете проверить эту статью, содержащую рекомендации по использованию SQLCipher with XCode 8 для справки, но то, что вы пытаетесь сделать, - это высокий риск.

+0

Стивен, я столкнулся с аналогичной проблемой, упомянутой здесь (http://stackoverflow.com/q/40263384/2624806). Любое предложение о том, что я делаю неправильно. – CoDe

+0

Проблема, с которой связано сообщение, заключается в том, что PRAGMA key = или sqlite3_key необходимо вызывать каждый раз при открытии базы данных. –

0

Если вы используете импорт стручков, вы можете добавить post_install для изменения OTHER_LDFLAGS, удалить iOS-систему sqlite3 флаг ссылки l "sqlite3".

post_install do | установочный |

installer.pods_project.targets.each do |target| 
    puts "#{target.name}"  
    target.build_configurations.each do |config| 
     xcconfig_path = config.base_configuration_reference.real_path 
     puts xcconfig_path 

     build_settings = Hash[*File.read(xcconfig_path).lines.map{|x| x.split(/\s*=\s*/, 2)}.flatten] 

     if build_settings['OTHER_LDFLAGS'] 
      other_ldflags = build_settings['OTHER_LDFLAGS'] 

      puts other_ldflags 

      if other_ldflags.include? '-l"sqlite3"' 

       puts "find -l sqlite3" 

       index = other_ldflags.index('-l"sqlite3"') 
       length = '-l"sqlite3"'.length 
       first_path = other_ldflags[0,index] 
       last_path = other_ldflags[index+length..-1] 
       exclude_ldflags = first_path + last_path 

       puts exclude_ldflags 

       build_settings['OTHER_LDFLAGS'] = exclude_ldflags 
      end 

      # write build_settings dictionary to xcconfig 
      File.open(xcconfig_path, "w") 
      build_settings.each do |key,value| 
       File.open(xcconfig_path, "a") {|file| file.puts "#{key} = #{value}"} 
      end 
     end 
    end 
end 

конец

Blockquote

0

Я использую sqlCipher и я получил эту проблему dyld: lazy symbol binding failed: Symbol not found: _sqlite3_key тоже. Я хочу добавить -all_load флаг в проект Build Settings ->Other Linker Flags, тогда все работает нормально. Надеюсь, это может помочь кому-то. :)

Смежные вопросы