3

我正在尝试将 MuPDF 放入 podspec 中。虽然这并不像我想要的那么好......

error: could not build module 'UIKit'

这是我每次尝试时都会遇到的错误pod lib lint。不过,我有两种口味,具体取决于 podspec 的确切内容。但在此之前,一些背景!

tl;dr:我的大脑无法处理 MuPDF 及其静态库依赖项来制作一个不错的 podspec。你能帮我吗?


文件布局

所以图书馆是MuPDF(http://mupdf.com);我克隆了他们的 git 存储库。它带有一堆.m文件,但主库是用 C 编写的,并且有几个依赖项。所以我们最终得到了一些静态库(.a文件)。文件布局如下所示:

mupdf/
  # objc files
  platform/ios/common.{h,m}
  platform/ios/Classes/*.{h,m}

  # headers and static libraries
  include/**/*.h
  platform/ios/thirdparty/*.a

include文件夹包含platform/ios/thirdparty. 这些标头包含在platform/ios/common.h.

播客规范

我的 podspec 看起来像这样:

Pod::Spec.new do |s|
  # <enter usual podspec yada yada here>

  s.source_files  = "platform/ios/Classes/**/*.{h,m}", "platform/ios/common.{h,m}", "include/**/*.h"
  s.public_header_files = "platform/ios/Classes/**/*.h"
  s.header_mappings_dir = "include"

  s.libraries = "z"
  s.vendored_libraries = "platform/ios/thirdparty/*"
end

基于此(以及 podspec 的变体),我得到两个不同的错误。

符号重定义错误

使用这个确切的 podspec 配置,我得到以下错误:

- ERROR |  /<path>/mupdf/include/mupdf/fitz/math.h:97:8:
           error: redefinition of 'fz_point_s'
- NOTE  |  /<path>/mupdf/include/mupdf/fitz/math.h:97:8:
           note: previous definition is here
- ERROR |  /<path>/mupdf/include/mupdf/fitz/math.h:121:8:
            error: redefinition of 'fz_rect_s'
- NOTE  |  /<path>/mupdf/include/mupdf/fitz/math.h:121:8:
           note: previous definition is here

# etc. etc.

- NOTE  |  Target Support Files/Pods-mupdf/Pods-mupdf-prefix.pch:2:9:
           fatal error: could not build module 'UIKit'

循环依赖错误

如果我注释掉该s.public_header_files行,我最终会出现循环依赖错误。太奇怪了!

- NOTE  |  /privateTarget Support Files/Pods-mupdf/Pods-mupdf-umbrella.h:1:9:
           fatal error: cyclic dependency in module 'UIKit':
           UIKit -> Foundation -> CoreFoundation -> MuPDF -> UIKit

结论

脑袋疼,求救!

4

2 回答 2

4

我不太确定您的 PodSpec 发生了什么,抱歉。这可能与您如何解决 math.h 头文件冲突有关 - 在 pod 规范中正确处理这一点非常棘手。

我刚刚为 MuPDF 创建了一个 CocoaPod ,并基于该 pod创建了一个示例应用程序,一切似乎都运行良好。

这里是我的 pod 规范供参考(请注意,这已经过时了;请参阅已发布的 mupdf pod 规范以获取与最新版本的 mupdf 和最新的 CocoaPods 兼容的规范):

# podspec for MuPDF
#
# Copyright (C) 2015 Joseph Heenan <joseph@heenan.me.uk>

Pod::Spec.new do |s|
  s.name             = "MuPDF"
  s.version          = "1.7"
  s.summary          = "A lightweight PDF and XPS viewer."
  s.description      = <<-DESC
                       MuPDF is a small, fast, and yet complete PDF viewer. 
                       It supports PDF 1.7 with transparency, encryption, 
                       hyperlinks, annotations, searching and more. It also
                       reads XPS and OpenXPS documents.
                       DESC
  s.homepage         = "http://www.mupdf.com/"
  s.license          = { :type => "Affero GNU GPL v3", :file => 'COPYING' }
  s.author           = "Artifex Software Inc"
  s.source           = { :git => "https://github.com/ArtifexSoftware/mupdf.git", :tag => s.version.to_s }

  s.platform     = :ios, '6.1'
  s.requires_arc = false

  s.source_files = 'platform/ios/Classes/**/*.[mh]', 'platform/ios/common.[mh]'
  s.resources = 'platform/ios/*.png', 'platform/android/res/drawable-ldpi/*.png'

  s.public_header_files = "platform/ios/Classes/**/*.h", "platform/ios/common.h"

  # See https://github.com/CocoaPods/CocoaPods/issues/1437
  s.preserve_paths = "include/*", "include/**/*"

  s.prepare_command = <<-CMD
      # I tried --depth 1 here but it failed with git error "fatal: reference is not a tree:"
      git submodule update --init
      cd platform/ios

      # build the various .a files
      # release armv7 + arm64
      xcodebuild -scheme MuPDF -configuration Release CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED=NO
      # release i386 + x86_64
      xcodebuild -scheme MuPDF -configuration Release -sdk iphonesimulator ONLY_ACTIVE_ARCH=NO CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED=NO

      # combine into fat libraries
      cd ../../build/
      for i in curl freetype jbig2dec jpeg mujs mupdf openjpeg z; do
          LIB=lib${i}.a
          lipo -create -output $LIB release-ios-i386-x86_64/$LIB release-ios-armv7-arm64/$LIB
      done
CMD

  s.vendored_libraries = "build/*.a"

  s.xcconfig = {
    # we have a math.h which conflicts with the system math.h unless
    # we disable header maps
    'USE_HEADERMAP' => 'NO',
    'HEADER_SEARCH_PATHS' => '"$(PODS_ROOT)/Target Support Files/Pods"',

    'USER_HEADER_SEARCH_PATHS' => '"${PODS_ROOT}/MuPDF/include"',

    'ALWAYS_SEARCH_USER_PATHS' => 'NO'
  }

end
于 2015-07-05T20:29:58.457 回答
0

我通过在 Build Phases -> Link Binary With Libraries 中删除和添加 UIKit.framework 解决了这个问题,并将项目的最低 iOS 版本设置为 6.0。

于 2015-06-04T07:15:37.040 回答