2016-10-18 70 views
1

我已經建立了一個動態庫(在這種情況下添加ICU支持),我需要添加作爲依賴到一個窗格。對於我創建了以下podspec吊艙(我刪除的東西喜歡的作者的許可,...儘量簡短)cocoapods dylib依賴use_frameworks

Pod::Spec.new do |s| 
    s.name  = 'unicode' 
    s.version = '57.0' 
    s.source    = { :git => "[email protected]:mycompany/unicode.git", :tag => "#{s.version}" } 
    s.requires_arc = false 
    s.platform = :ios, '8.0' 

    s.default_subspecs = 'all' 

    s.subspec 'all' do |ss| 
    ss.header_mappings_dir = 'icu4c/include' 
    ss.source_files = 'icu4c/include/**/*.h' 
    ss.public_header_files = 'icu4c/include/**/*.h' 
    ss.vendored_libraries = 'Frameworks/lib*.dylib' 
    end 

end 

在這裏,我有第二個吊艙,我需要這些庫也鏈接

Pod::Spec.new do |s| 
    s.name  = 'sqlite3' 
    s.version = '3.14.2' 
    s.summary = 'SQLite is an embedded SQL database engine' 
    s.documentation_url = 'https://sqlite.org/docs.html' 
    s.homepage = 'https://github.com/clemensg/sqlite3pod' 
    s.authors = { 'Clemens Gruber' => '[email protected]' } 

    v = s.version.to_s.split('.') 
    archive_name = "sqlite-amalgamation-"+v[0]+v[1].rjust(2, '0')+v[2].rjust(2, '0')+"00" 
    #s.source = { :http => "https://www.sqlite.org/#{Time.now.year}/#{archive_name}.zip" } 
    s.source    = { :git => "[email protected]:wrthphoenixspeedy/sqlite3.git", :tag => "#{s.version}" } 
    s.requires_arc = false 
    s.platform = :ios, '8.0' 

    s.default_subspecs = 'common' 

    s.subspec 'common' do |ss| 
    ss.source_files = "#{archive_name}/sqlite*.{h,c}" 
    ss.osx.pod_target_xcconfig = { 'OTHER_CFLAGS' => '$(inherited) -DHAVE_USLEEP=1' } 
    # Disable OS X/AFP locking code on mobile platforms (iOS, tvOS, watchOS) 
    sqlite_xcconfig_ios = { 'OTHER_CFLAGS' => '$(inherited) -DHAVE_USLEEP=1 -DSQLITE_ENABLE_LOCKING_STYLE=0' } 
    ss.ios.pod_target_xcconfig = sqlite_xcconfig_ios 
    ss.tvos.pod_target_xcconfig = sqlite_xcconfig_ios 
    ss.watchos.pod_target_xcconfig = sqlite_xcconfig_ios 
    end 

    # enable support for icu - International Components for Unicode 
    s.subspec 'icu' do |ss| 
    ss.dependency 'sqlite3/common' 
    ss.pod_target_xcconfig = { 'OTHER_CFLAGS' => '$(inherited) -DSQLITE_ENABLE_ICU=1' } 
    ss.dependency   'unicode', '57.0' 
    ss.libraries = 'icucore', 'icudata.57.1', 'icui18n.57.1', 'icuio.57.1', 'icule.57.1', 'iculx.57.1', 'icutu.57.1', 'icuuc.57.1' 
    end 

end 

而這些我能夠編譯它。 Cocoapods將這些庫在編譯時複製到文件夾../Frameworks/,而不是在運行時進行。相反,它會失敗,因爲它說它找不到../lib中的庫。

dyld: Library not loaded: ../lib/libicudata.57.1.dylib 
    Referenced from: /var/containers/Bundle/Application/9663CB3A-6ACD-487E-A92D-48F8AFE5260C/MyApp.app/MyApp 
    Reason: image not found 

我必須使用use_frameworks!因爲我也使用了一些Swift框架。

所以我做錯了什麼......問題是,我可以鏈接從一個吊艙dylib到另一個吊艙嗎?如果是的話......怎麼樣?

+0

在第二個podspec中:ss.dependency和dependencies之間缺少「=」。打印後顯示錯誤的錯字?另外,爲什麼你有兩個's.dependecy'你不能把它放在一行嗎?我想知道如果你有像這樣的各種線路會發生什麼,它是否添加或只採取第一個或最後一個。 – Larme

回答

0

基於「libs」和「Frameworks」之間的不一致,這看起來像是runpath search paths(運行的應用程序不是從框架中查找庫)或者庫的安裝名稱不匹配相對於它從哪裏動態加載的位置。

  1. 確保在捆綁已包含在您的「運行路徑搜索路徑」以下路徑的動態庫的應用程序:@executable_path/../Frameworks@loader_path/../Frameworks

  2. 確保「動態庫安裝名稱」正在加載的庫的名稱設置爲相當於@rpath/$(EXECUTABLE_PATH)(即在你的情況下它應該是「@ rpath/libicudata.57.1​​.dylib」)。您可以在編譯時使用-install_name編譯器(鏈接器?)標誌或install_name_tool來設置它,如下所示:install_name_tool -id "@rpath/libicudata.57.1.dylib" libicudata.57.1.dylib。但希望不會這樣。

+0

與此同時,我能夠解決它...基本上你提到的第二個選項是我的情況的問題。儘管前幾天我能夠自己回答這個問題,而且你遲到了幾分鐘,我會給你正確答案的賞金。 – Hons

+0

謝謝!這個安裝名稱的東西總是非常複雜,而且Xcode的默認設置並不能讓它更容易適應更復雜的場景。 – mz2

相關問題