在Mac OSX 10.8上,XCode 4.6,在C ++中
我正在关注系统中位于opencv_tutorials.pdf
的{{1}}中的教程。在页311,我们得到此示例(略有编辑):
/opt/local/share/OpenCV/doc
我必须将上面的代码修改为#include <stdio.h>
#include <iostream>
#include "opencv2/core/core.hpp"
#include "opencv2/features2d/features2d.hpp"
#include "opencv2/highgui/highgui.hpp"
using namespace cv;
int main( int argc, char** argv ) {
Mat img_1 = imread( argv[1], CV_LOAD_IMAGE_GRAYSCALE );
int minHessian = 400;
SurfFeatureDetector detector( minHessian );
std::vector<KeyPoint> keypoints_1;
detector.detect( img_1, keypoints_1 );
}
,这是我通过运行
#include "opencv2/nonFree/features2d.hpp"
代码编译,意味着在find /opt/local/include -name "*.hpp" -exec grep SurfFeatureDetector "{}" ';' -print
文件中找到符号detector.detect
,并通过C ++编译器进行类型检查。接下来是尝试查找包含符号的库。
现在,我在我的发行版中有这些库,hpp
:
/opt/local/lib
我发现libopencv_calib3d.2.4.3.dylib
libopencv_contrib.2.4.3.dylib
libopencv_core.2.4.3.dylib
libopencv_features2d.2.4.3.dylib
libopencv_flann.2.4.3.dylib
libopencv_gpu.2.4.3.dylib
libopencv_highgui.2.4.3.dylib
libopencv_imgproc.2.4.3.dylib
libopencv_legacy.2.4.3.dylib
libopencv_ml.2.4.3.dylib
libopencv_nonfree.2.4.3.dylib
libopencv_objdetect.2.4.3.dylib
libopencv_photo.2.4.3.dylib
libopencv_stitching.2.4.3.dylib
libopencv_ts.2.4.3.dylib
libopencv_video.2.4.3.dylib
libopencv_videostab.2.4.3.dylib
搜索这些所需的符号没有信息,因为名称修改很难在我脑中反编译。我只是暴力包含所有库,但仍然会出现链接器错误:
nm
我已经从这里开始对OpenCv参考文档和维基页面进行了一些现场检查
Undefined symbols for architecture x86_64:
"cv::imread(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, int)", referenced from:
_main in main.o
"cv::FeatureDetector::detect(cv::Mat const&, std::__1::vector<cv::KeyPoint, std::__1::allocator<cv::KeyPoint> >&, cv::Mat const&) const", referenced from:
_main in main.o
ld: symbol(s) not found for architecture x86_64
但没有成功。
我很感激
答案 0 :(得分:8)
在Linux上并使用 OpenCV 3.0.0 ,我必须与opencv_imgcodecs
共享库链接。
答案 1 :(得分:2)
我的工具链利用CMake来跟踪这些事情。对于我使用的大多数新库,通常有google可搜索的Find * .cmake文件,这些文件是由其他人编写的。如果您想了解有关我的具体设置的更多信息,请随时提出。我已经在非自由库中看到了这个特定问题(架构x86_64的未定义符号)几次。不过,我不知道为什么你会为imread得到错误。我要看的第一个地方是samples / cpp文件夹中的matcher_simple.cpp示例。如果您可以编译并运行它(使用this)和其他示例,那么您的设置应该没问题。如果你不能,请你发布那个例子的错误吗?我不熟悉XCode,但someone else建议转到Build Settings&gt; Build Options&gt;编译器用于C / C ++ / Objective-C并将其从Apple LLVM编译器更改为LLVM GCC 4.2。还有一些其他的猜测here。
答案 2 :(得分:0)
尝试在构建设置中的其他链接器标记列表中包含-lopencv_features2d
和-lopencv_nonfree
。我遇到了同样的问题而且它对我有用