用Mac OS X Sierra上的OpenCV C 编译Hello World
Compiling hello world with opencv c++ on mac os x sierra
第一次我无法编译Hello World。我遵循了大量的教程如何安装OpenCV。我只有以下示例:
#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace std;
using namespace cv;
int main()
{
Mat imageMe = imread("test.jpg", 0);
return 0;
}
来自OpenCV网站。看起来很简单,但不会编译。
g++ display_image.cpp `pkg-config --cflags --libs opencv` -l
这是错误:
display_image.cpp:2:10: fatal error: 'opencv2/core/core.hpp' file not found
#include <opencv2/core/core.hpp>
^
1 error generated.
和运行:
pkg-config --cflags --libs opencv
返回此:
-I/usr/local/Cellar/opencv3/3.2.0/include/opencv -I/usr/local/Cellar/opencv3/3.2.0/include/opencv2 -L/usr/local/Cellar/opencv3/3.2.0/lib -lopencv_calib3d -lopencv_imgproc -lopencv_contrib -lopencv_legacy -l
存在这些文件。
运行ls /usr/local/Cellar/opencv3/3.2.0/include/opencv2/core | grep core.hpp
给出结果:
core.hpp
有什么问题?
编辑:我一直在使用以下教程在计算机上安装OpenCV:
http://www.pyimagesearch.com/2016/12/19/install-opencv-3-on-macos-with-homebrew-homebrew-the-easy-way/
https://www.learnopencv.com/install-opencv-3-on-yosemite-osemite-osx-10-10-x/
https://blogs.wcode.org/2014/10/howto-install-build-and-us-sen-popencv-macosx-10-10/
http://seeb0h.github.io/howto/howto-install-homebrew-python-opencv-opencv-osx-el-capitan/
编辑:
即使在所有这些答案之后,我也无法编译一个应用程序。即使它以某种方式可以找到直接包含在我的文件中的.hpp文件,但失败的查找包括内部。
可能我的配置是错误的。在/usr/local/cellar/opencv3我有2个目录:3.2.0-可能已安装的二进制文件HEAD -9053839-从源
汇编现在,我也有opencv.pc文件,位于/usr/local/lib/pkgconfig中:
prefix=/usr/local/Cellar/opencv3/3.2.0
exec_prefix=${prefix}
includedir=${prefix}/include
libdir=${exec_prefix}/lib
Name: opencv
Description: The opencv library
Version: 2.x.x
Cflags: -I${includedir}/opencv -I${includedir}/opencv2
Libs: -L${libdir} -lopencv_calib3d -lopencv_imgproc -lopencv_contrib -lopencv_legacy -l
作为前缀,我也尝试了Head-9053839。
我创建了更简单的示例:
#include <opencv2/opencv.hpp>
int main(){return 0; }
仍然告诉我,找不到" opencv2/opencv.hpp"文件。然后我打印了PKG-Config所说的:pkg-config - flags-libs opencv
-I/usr/local/Cellar/opencv3/3.2.0/include/opencv -I/usr/local/Cellar/opencv3/3.2.0/include/opencv2 -L/usr/local/Cellar/opencv3/3.2.0/lib -lopencv_calib3d -lopencv_imgproc -lopencv_contrib -lopencv_legacy -l
发现它应该直接包括DIR,而不是OpenCV/OpenCV2子目录。
所以我已经像这样运行了G :
g++ -I/usr/local/Cellar/opencv3/3.2.0/include -L/usr/local/Cellar/opencv3/3.2.0/lib -lopencv_calib3d -lopencv_imgproc -lopencv_contrib -lopencv_legacy -l display_image.cpp
然后告诉我:
ld: library not found for -lopencv_contrib
删除后说:
ld: library not found for -lopencv_legacy
然后,我必须在display_image.cpp之前删除-l,但是我还有另一个错误:
Undefined symbols for architecture x86_64:
"cv::String::deallocate()", referenced from:
cv::String::~String() in display_image-9d8f86.o
cv::String::operator=(cv::String const&) in display_image-9d8f86.o
这是地狱。
我没有汇编环境可以再生您的错误,但我认为问题是您的代码中的这些行:
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
由于OPENCV目录正在从
搜索/usr/local/Cellar/opencv3/3.2.0/include/opencv2
作为您的" pkg-config -flags-libs opencv"所暗示。因此,我想,将包含行更改为
#include <core/core.hpp>
#include <highgui/highgui.hpp>
会有所帮助,或者您可以隐式声明要搜索的目录:
g++ -I/usr/local/Cellar/opencv3/3.2.0/include display_image.cpp ...
在 opencv 3.x 中,标题文件的布局已更改,现在您几乎只使用:
#include <opencv2/opencv.hpp>
因此,从具体的角度来看,我建议您用上述咒语替换第二行和第三行。
请参阅OpenCV过渡指南。
Soner的答案应解决OP的问题。我想添加其他解决方案。
如果您使用CMake从源安装OpenCV,它将在/usr/local/lib
中将OpenCV库和/usr/local/include
中的OpenCV标头放置。标头全部进入子文件夹/usr/local/include/opencv
。由于它们是大多数IDE的默认库和标头目录,因此您发现的所有示例都可以使用该配置。
现在,brew
不如您已经知道,在上述文件夹上安装了OPENCV。因此,您有三个选择:
-
更改OpenCV库和标题的编译器的搜索路径:
g++ -I/usr/local/Cellar/opencv3/3.2.0/include -L/usr/local/Cellar/opencv3/3.2.0/lib
-
软链接
/usr/local/Cellar/opencv3/3.2.0/include/opencv
to/usr/local/include
和/usr/local/Cellar/opencv3/3.2.0/lib
to/usr/local/lib
-
使用CMAKE从源安装OpenCV。
我做到了!这是PKG-Config的问题。在/usr/local/Cellar/opencv3/3.2.0/lib/pkgconfig
中,我找到了Opencv.pc,看起来像这样:
# Package Information for pkg-config
prefix=/usr/local/Cellar/opencv3/3.2.0
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir_old=${prefix}/include/opencv
includedir_new=${prefix}/include
Name: OpenCV
Description: Open Source Computer Vision Library
Version: 3.2.0
Libs: -L${exec_prefix}/lib -lopencv_shape -lopencv_stitching -lopencv_objdetect -lopencv_superres -lopencv_videostab -lopencv_calib3d -lopencv_features2d -lopencv_highgui -lopencv_videoio -lopencv_imgcodecs -lopencv_video -lopencv_photo -lopencv_ml -lopencv_imgproc -lopencv_flann -lopencv_core
Libs.private: -framework OpenCL -L/usr/local/opt/jpeg/lib -ljpeg -L/usr/local/lib -lpng -ltiff -lImath -lIlmImf -lIex -lHalf -lIlmThread -L/usr/lib -lz -framework Cocoa -framework AVFoundation -framework CoreGraphics -framework CoreMedia -framework CoreVideo -framework QuartzCore -framework Accelerate
Cflags: -I${includedir_old} -I${includedir_new}
我替换了位于:/usr/local/lib/pkgconfig
的旧opencv.pc现在我没有遇到任何错误。
我还必须使用不同的包括文件:
#include <opencv2/opencv.hpp>
- 无法编译wxWidgets Hello World
- 如何使用CLion和MSVC编译器工具链编译wxWidgets Hello World应用程序而没有错误?
- 为什么 const char* const & = 可以编译"hello"?
- macos GCC 工具链编译简单 hello 世界的问题
- 为什么一个简单的"Hello World"风格的程序不能用Turbo C++编译?
- Visual Studio 中的 Hello World C++ 应用程序 - 关于预编译标头不同的问题
- CPP-Netlib Hello World 示例不会在 Linux 上编译
- 在终端(MACOS)中编译Hello World.cpp
- 使用 Visual Studio Code 在 Linux 中创建和编译"hello world"应用程序
- 用Mac OS X Sierra上的OpenCV C 编译Hello World
- WxWidgets Hello World 编译失败:"wchar_t must be available"
- 编译QT Hello World程序时未定义的参考错误
- 从OpenVDB编译Hello World示例
- 用于在 Visual Studio 2005 中编译 Win32 "hello world"的命令行
- 无法在我的 OSX 中编译"hello world" cpp
- V8 "Hello World"示例 - 在 Ubuntu 13.10 上编译 - 大量未定义的引用错误 "icu_46"
- "Operation not permitted" 在 El Capitan 上运行 hello world 二进制编译 w/ clang++
- 用 Mingw 编译的 C++ 文件不打印 Hello World
- 默认"Hello World"示例上的黑莓 10 编译错误
- 提升::测试:编译和运行"hello world"程序