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 语句中找到任何内容。
我尝试做的一些事情包括:
- 将文件类型设置为 C++ header 而不是 C header
- 已检查以确保 header 文件具有目标成员资格
我也在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++ 代码,从而使其能够正常工作。
我的情况涉及私人开发的 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 语句中找到任何内容。
我尝试做的一些事情包括:
- 将文件类型设置为 C++ header 而不是 C header
- 已检查以确保 header 文件具有目标成员资格
我也在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++ 代码,从而使其能够正常工作。