CocoaPod 中的 C++ header 文件无法从框架导入

A C++ header file in a CocoaPod is unable to import from a framework

我的情况涉及私人开发的 CocoaPod,其中包含 OpenCV 框架,以及用于使用它的包装器和接口文件。此设计旨在简化 cross-platform 我们其他应用程序的共享。

下面是一张略显粗糙的图:

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++库文件header中,我们有以下内容:

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

#include "opencv2/core.hpp"

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

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

我也在Xcode中探索了框架搜索路径:

我在没有指定OpenCV框架路径的情况下测试过,没有什么区别。我只是包括这个以表明这是尝试过的。

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

另一个需要注意的事项。将框架添加到 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/ .

原来问题是 Cocoapods 暴露了我拥有的 C++ 库的头文件,这反过来导致了 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++ 代码,从而使其能够正常工作。