如何创建包含静态库的pod?

nhg*_*rif 9 objective-c cocoapods podspec

我正在努力使我的图书馆作为CocoaPod工作,并希望任何协助指出我正确的方向.

我以前从来没有制作过Pod,我觉得我已经把所有东西都弄好了,这可行......如果它是一个只有未编译的.h/ .m/ .swift文件的简单pod ,但是,我的库包含一个编译过的.a文件,一个静态库,我的库使用.

我在Xcode中的项目被设置为将Objective-C库编译成.a库.如果我在Xcode中编译它,它生成这个文件完全没有问题,但是,当我尝试lint podspec时,我得到链接器错误,似乎与我试图链接到的静态库有关.

SQLConnect.podspec

#
# Be sure to run `pod lib lint NAME.podspec' to ensure this is a
# valid spec and remove all comments before submitting the spec.
#
# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html
#
Pod::Spec.new do |s|
  s.name                = "SQLConnect"
  s.version             = "1.2.0"
  s.summary             = "Connects apps to SQL Server"
  s.description         = <<-DESC
                            A library for connecting Objective-C & Swift apps to SQL Server
                        DESC
  s.homepage            = "http://importblogkit.com"
  s.license             = 'MIT'
  s.authors             = { "Nick Griffith" => "nhgrif@gmail.com" }
  s.social_media_url    = 'https://twitter.com/importBlogKit'
  s.source              = { :git => "https://github.com/nhgrif/SQLConnect.git", :tag => s.version.to_s }

  s.platform                = :ios, '8.0'
  s.ios.deployment_target   = '8.0'
  s.requires_arc            = true
  s.public_header_files     = 'SQLConnect/*.h', 'SQLConnect/SQLSettings/*.h', 'SQLConnect/SQLControllers/*.h', 'SQLConnect/SQLConnection/*.h'
  s.source_files            = 'SQLConnect/**/*.{h,m}'
  s.preserve_paths          = 'SQLConnect/**/*.*'
  s.vendored_libraries      = 'SQLConnect/FreeTDS/libfreetds.a'
  s.xcconfig                = { 'HEADER_SEARCH_PATHS' => "${PODS_ROOT}/#{s.name}/SQLConnect/**" }
end
Run Code Online (Sandbox Code Playgroud)

我也尝试过其他方法,比如让图书馆成为一个子规格,但似乎没什么用.

尽管在Xcode中编译很好,但是linter会给出链接器错误:

The following build commands failed:
    Ld /var/folders/yj/h_f7h7ws3zzfd__f847qys3m0000gn/T/CocoaPods/Lint/build/Pods.build/Release-iphonesimulator/Pods-SQLConnect.build/Objects-normal/i386/SQLConnect normal i386
    Ld /var/folders/yj/h_f7h7ws3zzfd__f847qys3m0000gn/T/CocoaPods/Lint/build/Pods.build/Release-iphonesimulator/Pods-SQLConnect.build/Objects-normal/x86_64/SQLConnect normal x86_64
(2 failures)
 -> SQLConnect (1.2.0)
    - ERROR | [iOS] Returned an unsuccessful exit code.
    - NOTE  |  clang: error: linker command failed with exit code 1 (use -v to see invocation)

Analyzed 1 podspec.

[!] The spec did not pass validation.
Run Code Online (Sandbox Code Playgroud)

在输出中向上滚动,我可以找到以下错误:

Undefined symbols for architecture i386:
  "_iconv", referenced from:
      _tds_iconv_init in libfreetds.a(iconv.o)
      _tds_iconv in libfreetds.a(iconv.o)
      _skip_one_input_sequence in libfreetds.a(iconv.o)
      _tds_iconv_fread in libfreetds.a(iconv.o)
     (maybe you meant: _tds_iconv_close, _tds_iconv_get , _tds_iconv , _tds_iconv_alloc , _tds_iconv_free , _tds_iconv_from_collate , _tds_iconv_open , _tds_iconv_fread )
  "_iconv_close", referenced from:
      _tds_iconv_init in libfreetds.a(iconv.o)
      _tds_iconv in libfreetds.a(iconv.o)
      _skip_one_input_sequence in libfreetds.a(iconv.o)
      __iconv_close in libfreetds.a(iconv.o)
      _tds_set_iconv_name in libfreetds.a(iconv.o)
     (maybe you meant: _tds_iconv_close)
  "_iconv_open", referenced from:
      _tds_iconv_init in libfreetds.a(iconv.o)
      _tds_iconv_info_init in libfreetds.a(iconv.o)
      _tds_iconv in libfreetds.a(iconv.o)
      _skip_one_input_sequence in libfreetds.a(iconv.o)
      _tds_set_iconv_name in libfreetds.a(iconv.o)
     (maybe you meant: _tds_iconv_open)
ld: symbol(s) not found for architecture i386
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Run Code Online (Sandbox Code Playgroud)

Undefined symbols for architecture x86_64:
  "_iconv", referenced from:
      _tds_iconv_open in libfreetds.a(iconv.o)
      _tds_iconv in libfreetds.a(iconv.o)
      _tds_iconv_fread in libfreetds.a(iconv.o)
     (maybe you meant: _tds_iconv_close, _tds_iconv_get , _tds_iconv , _tds_iconv_alloc , _tds_iconv_free , _tds_iconv_from_collate , _tds_iconv_open , _tds_iconv_fread )
  "_iconv_close", referenced from:
      _tds_iconv_open in libfreetds.a(iconv.o)
      _tds_iconv_info_close in libfreetds.a(iconv.o)
      _tds_iconv in libfreetds.a(iconv.o)
      _tds_set_iconv_name in libfreetds.a(iconv.o)
     (maybe you meant: _tds_iconv_close)
  "_iconv_open", referenced from:
      _tds_iconv_open in libfreetds.a(iconv.o)
      _tds_iconv_info_init in libfreetds.a(iconv.o)
      _tds_iconv in libfreetds.a(iconv.o)
      _tds_set_iconv_name in libfreetds.a(iconv.o)
     (maybe you meant: _tds_iconv_open)
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Run Code Online (Sandbox Code Playgroud)

这似乎表明该项目存在问题......但我可以将其编译成.a没有问题.我也通过将原始源文件或生成的.a文件(我的libSQLConnect.a,而不仅仅是libFreeTDS.a)拖放到iOS项目中来使用此库.

那么如何将这项工作作为一个pod呢?

该库可以在Github上找到.

pev*_*uez 5

看起来你需要与libiconv链接.添加:

s.libraries = 'iconv'
Run Code Online (Sandbox Code Playgroud)

在你的吊舱将带你到那里.

我已经通过修复程序在Github向您发送了拉取请求.