【问题标题】:A C++ header file in a CocoaPod is unable to import from a frameworkCocoaPod 中的 C++ 头文件无法从框架导入
【发布时间】:2016-10-02 12:25:17
【问题描述】:

我的情况涉及一个私人开发的 CocoaPod,它包含 OpenCV 框架,以及用于使用它的包装器和接口文件。此设计旨在简化我们其他应用的跨平台共享。

这是一个显示各个部分的粗略图表:

opencv2.framework -> c++ interface file -> objective-c wrapper -> application

如果我将前三个部分直接放在目标应用程序中,一切都会按预期进行。但是,我们失去了跨平台轻松共享此文件的能力,并且我们需要在更改从 c++ 接口传播时手动更新文件。

我目前看到的问题是,当框架、接口和包装器位于 CocoaPod 中时,一旦导入应用程序,接口文件就无法从框架(以及标准 C++ 库)导入)。

这是我正在处理相关部分的 podspec 文件:

Pod::Spec.new do |s|

s.name                  = 'PodName'
s.source                = { :path => "." }
s.source_files          = "path/to/source/files/Classes/**/*.{h,mm}", "c++libraryPath/**/*.{h,cpp}"
s.vendored_frameworks   = 'path/to/framework/file/Frameworks/opencv2.framework'
s.frameworks            = 'Accelerate', 'AssetsLibrary', 'AVFoundation', 'CoreGraphics', 'CoreImage', 'CoreMedia', 'CoreVideo', 'Foundation', 'opencv2', 'QuartzCore', 'UIKit'
s.libraries             = 'stdc++'

end

在 C++ 库文件头中,我们有以下内容:

#include <string>
#include <map>
#include <vector>
#include <memory>

#include "opencv2/core.hpp"

将该文件放入目标项目后,一切正常。但是,在 CocoaPod 中,它无法在 include 语句中找到任何内容。

我尝试做的一些事情包括:

  • 将文件类型设置为 C++ 标头而不是 C 标头
  • 检查以确保头文件具有目标成员身份

我还探索了 Xcode 中的框架搜索路径:

我在没有具体路径的情况下进行了 OpenCV 框架的测试,它没有任何区别。我只是将其包含在内以表明已尝试过。

我还测试了一个非常简化的 CocoaPod,它只包含 OpenCV 框架和 C++ 库类。当我只使用框架导入 CocoaPod 时,我能够成功访问其中包含的方法。但是,一旦我添加了 C++ 类,它就找不到任何包含。

另一个需要注意的项目。在将框架添加到 CocoaPods 后,我们发现内部链接被破坏,导致各种问题。通过在 OpenCV 框架内运行以下命令重新创建链接:

rm -rf Headers
ln -s Versions/A/Headers/ .
rm -rf opencv2
ln -s Versions/A/opencv2 .
rm -rf Resources
ln -s Versions/A/Resources/ .

【问题讨论】:

    标签: c++ ios objective-c opencv cocoapods


    【解决方案1】:

    原来问题是我拥有的 C++ 库的头文件被 Cocoapods 暴露,这反过来又导致了 Swift 项目的问题。

    解决方案是在 podspec 文件中执行此操作:

    s.public_header_files = { all header files for code that was in Obj-C }
    
    s.private_header_files = { all header files for code that was pure C / C++ }
    

    使用它,我能够从 Swift 项目中隐藏 C/C++ 代码,使其能够正常工作。

    【讨论】:

    • 您知道供应商框架方法是否适用于 Xcode 的现代构建系统?我目前在使用 OpenCV 作为私有 pod 中的 pod 依赖项时遇到了类似的问题。当我将私有 pod 集成到测试项目中时,当我调用 cv::Mat 时,编译器会抛出错误“预期表达式”,但是导入似乎很好。知道我在这里可能缺少什么吗?
    • @Erle 我有一段时间没有使用过 OpenCV,但有机会我会调查一下并告诉你。
    • 那太棒了
    • 我面临着完全相同的问题,我在私人 pod 上打开了 cv。一切似乎都很好,但最终没有检测到 导入。我尝试了您的解决方案,将标头分为私有和公共。但还是一样。您有机会在此@CodeBender 上为我提供帮助
    猜你喜欢
    • 1970-01-01
    • 2016-04-05
    • 1970-01-01
    • 1970-01-01
    • 2016-03-06
    • 2018-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多