Cod*_*der 5 c++ opencv objective-c ios cocoapods
我的情况涉及一个私人开发的 CocoaPod,它包含 OpenCV 框架,以及用于使用它的包装器和接口文件。此设计旨在简化我们其他应用程序的跨平台共享。
这是一个有点粗糙的图表,显示了这些部分:
opencv2.framework -> c++ interface file -> objective-c wrapper -> application
Run Code Online (Sandbox Code Playgroud)
如果我取前三个部分,并将它们直接放在目标应用程序中,一切都会按预期进行。然而,我们失去了跨平台轻松共享的能力,我们需要在更改从 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
Run Code Online (Sandbox Code Playgroud)
在 C++ 库文件头中,我们有以下内容:
#include <string>
#include <map>
#include <vector>
#include <memory>
#include "opencv2/core.hpp"
Run Code Online (Sandbox Code Playgroud)
当该文件放入目标项目时,一切正常。但是,在 CocoaPod 中,它无法在 include 语句中找到任何内容。
我尝试做的一些事情来帮助它包括:
我已经在没有 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/ .
Run Code Online (Sandbox Code Playgroud)
事实证明,问题在于我拥有的 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++ }
Run Code Online (Sandbox Code Playgroud)
使用它,我能够隐藏 Swift 项目中的 C/C++ 代码,从而使其能够正常工作。