【发布时间】: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 标头
- 检查以确保头文件具有目标成员身份
我在没有具体路径的情况下进行了 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