cocoapods dylib 依赖项 use_frameworks
cocoapods dylib dependency use_frameworks
我已经构建了一个动态库(在这种情况下添加 ICU 支持),我需要将其添加为 pod 的依赖项。为此,我创建了一个具有以下 podspec 的 pod(我删除了作者、许可证等内容......以保持简短)
Pod::Spec.new do |s|
s.name = 'unicode'
s.version = '57.0'
s.source = { :git => "git@bitbucket.org: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,我也需要 link 这些库
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' => 'clemensgru@gmail.com' }
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 => "git@bitbucket.org: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 框架。
所以我做错了什么...问题是,我可以 link 从一个 pod 到另一个 pod 的 dylib 吗?如果是这样......怎么办?
根据 "libs" 和 "Frameworks" 之间的差异,这看起来像是 runpath search paths 的问题(运行 应用程序未从 Frameworks 中寻找库),或者库的安装名称与它相对于动态加载位置的放置位置不匹配。
确保在捆绑动态库的应用中,您的 "Runpath Search Path" 中包含以下路径:@executable_path/../Frameworks
、@loader_path/../Frameworks
确保正在加载的库的 "Dynamic Library Install Name" 名称设置为 @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
。希望不会出现这种情况。
我已经构建了一个动态库(在这种情况下添加 ICU 支持),我需要将其添加为 pod 的依赖项。为此,我创建了一个具有以下 podspec 的 pod(我删除了作者、许可证等内容......以保持简短)
Pod::Spec.new do |s|
s.name = 'unicode'
s.version = '57.0'
s.source = { :git => "git@bitbucket.org: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,我也需要 link 这些库
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' => 'clemensgru@gmail.com' }
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 => "git@bitbucket.org: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 框架。
所以我做错了什么...问题是,我可以 link 从一个 pod 到另一个 pod 的 dylib 吗?如果是这样......怎么办?
根据 "libs" 和 "Frameworks" 之间的差异,这看起来像是 runpath search paths 的问题(运行 应用程序未从 Frameworks 中寻找库),或者库的安装名称与它相对于动态加载位置的放置位置不匹配。
确保在捆绑动态库的应用中,您的 "Runpath Search Path" 中包含以下路径:
@executable_path/../Frameworks
、@loader_path/../Frameworks
确保正在加载的库的 "Dynamic Library Install Name" 名称设置为
@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
。希望不会出现这种情况。