如何在 Cocoa 应用程序中包含 OpenCV?
Posted
技术标签:
【中文标题】如何在 Cocoa 应用程序中包含 OpenCV?【英文标题】:How to include OpenCV in Cocoa Application? 【发布时间】:2010-09-28 08:04:23 【问题描述】:当我使用“命令行工具”c++ stdc++ 模板创建 xCode 项目时,我能够包含和编译 opencv 头文件并运行一些代码。
但我想在“Cocoa 应用程序”上下文中使用 OpenCV。使用该模板创建时,当我在 main.mm 中包含 OpenCV 标头时出现编译错误。 (我已经把main.m改成了main.mm,'//NSApplicationMain(argc, (const char **) argv);'被注释掉了)
其中一个错误是:“语句表达式只允许在函数内部”
我想它是某种编译器版本错误,但是当我比较项目构建设置时,我找不到差异。
您有什么想法/专长吗?
【问题讨论】:
【参考方案1】:我遇到了同样的问题,我花了 2 天时间进行认真的系统跟踪,果然,解决方案非常简单,一个 8 岁的孩子可以比我更快地找到它。
准备好了吗?
在您要使用 OpenCV 的 .mm 文件中,您需要在任何其他包含之前执行您的 #include "opencv2/opencv.hpp"
。就是这样!只需将其向上移动一条线,您的问题就会神奇地消失,比真正将房间绑在一起的地毯更快。
顺便说一下,这是针对 OpenCV 2.2 的,因此是新的包含文件。此外,如果您的 XCode 项目使用前缀头文件(在“其他来源”中查找“YourProjectName_Prefix.pch”文件),那么您需要将 #include "opencv2/opencv.hpp"
放在那里而不是任何其他文件中。
【讨论】:
即使没有实际的 Prefix.pch,目标的构建设置也可能包含一个前缀标头,例如系统的 UIKit.h。在删除它之后,它终于在我的机器上构建了。【参考方案2】:Ian Charnas 的回答是正确的,但我会做一个修改。
这篇文章有一个更具体的解决方案,并解释了为什么需要这样做。 http://aptogo.co.uk/2011/09/opencv-framework-for-ios/
// 在 UIKit 和 Foundation 的 #import 语句之前添加这个新部分
#ifdef __cplusplus
#import <opencv2/opencv.hpp>
#endif
【讨论】:
【参考方案3】:即使您将“main.m”重命名为“main.mm”并将“#include opencv2/opencv.hpp”移动到顶部(在主文件中),预处理器也会首先插入 cocoa.h,因为预编译头文件的名称类似于“_Prefix.pch”。为避免此类问题 - 删除#import 语句或 - 在 cocoa.h 导入语句上方插入 #import 语句
【讨论】:
【参考方案4】:尝试将:-lstdc++
添加到 Cocoa 应用的构建设置中的“其他链接器标志”中。
默认情况下,由 Xcode 模板制作的可可应用程序不会在其设置中链接包含 c++ 库。
【讨论】:
嗨,我还添加了-lz,但仍然遇到同样的错误。我正在 i386 上构建。我错过了什么? 你为什么要注释掉 NSApplicationMain()?您必须使用更具体的信息更新您的问题,例如确切的错误消息和/或足够的代码 sn-p 以获得问题的线索。【参考方案5】:将此添加到您的 .pch 文件中
#ifdef __cplusplus
#import <opencv2/opencv.hpp>
#endif
不要忘记将所有 .m 文件转换为 .mm 文件
【讨论】:
【参考方案6】:您可能会发现使用 OpenCV 的 C
API 比使用 C++
API 更容易。当然,您可以直接从 Objective C 调用 C API,因此这让生活变得更加轻松。你只是失去了一些 C++ 的语法糖,比如默认参数值。
【讨论】:
以上是关于如何在 Cocoa 应用程序中包含 OpenCV?的主要内容,如果未能解决你的问题,请参考以下文章
qt:在一个 gui 窗口中包含 opencv 和 opengl 子窗口
不能在 Linux 的 Matlab 中包含 OpenCV 函数
OpenCV 2.4:Windows 中 Qt 中包含的问题