在此之前被标记为重复问题请阅读结束。谢谢你的期待。
我使用home-brew设置openCV。
这些是我使用的命令:
brew tap homebrew/science
brew install opencv
我正在使用我在网上找到的以下简单文件来测试我的设置:
// Example showing how to read and write images
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace cv;
int main(int argc, char** argv)
{
// Load an image from file - change this based on your image name
Mat img = imread("my_image.jpg", CV_LOAD_IMAGE_UNCHANGED);
if(img.empty())
{
fprintf(stderr, "failed to load input image\n");
return -1;
}
// this is just to show, that you won't have to pre-alloc
// result-images with c++ any more..
Mat gray;
cvtColor(img,gray,CV_BGR2GRAY);
// Write the image to a file with a different name,
// using a different image format -- .png instead of .jpg
if( ! imwrite("my_image_copy.png", img) )
{
fprintf(stderr, "failed to write image file\n");
}
// no need to release anything with c++ !
return 0;
}
这是我在尝试编译并运行suing g++ test.cpp -o test
后得到的错误。
Undefined symbols for architecture x86_64:
"cv::_InputArray::_InputArray(cv::Mat const&)", referenced from:
_main in test-41a30e.o
"cv::namedWindow(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, int)", referenced from:
_main in test-41a30e.o
"cv::destroyWindow(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)", referenced from:
_main in test-41a30e.o
"cv::Mat::deallocate()", referenced from:
cv::Mat::release() in test-41a30e.o
"cv::imread(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, int)", referenced from:
_main in test-41a30e.o
"cv::imshow(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, cv::_InputArray const&)", referenced from:
_main in test-41a30e.o
"cv::waitKey(int)", referenced from:
_main in test-41a30e.o
"cv::fastFree(void*)", referenced from:
cv::Mat::~Mat() in test-41a30e.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
我确实在堆栈溢出时发现了类似的问题,但没有使用自制程序,我不确定时间敏感度(关于OpenCV,我的操作系统等的更新和更改)问题是什么。我使用的是10.9.4操作系统的mac。这些答案对我来说并不是很清楚应该改变什么。许多人只是提出了一行代码而没有说明该行应该去哪里。我对这些技术非常新手。任何帮助都会非常感谢!
编辑: Mark Setchell帮助解决了第一批错误。但我现在得到: g ++ $(pkg-config --cflags --libs opencv)test.cpp -o Test&amp; ./Test
[3] 7187 dyld:未加载库:lib / libopencv_calib3d.2.4.dylib 参考自:/usr/local/Cellar/opencv/2.4.9/include/./Test 原因:找不到图像 [2]完成g ++ $(pkg-config --cflags --libs opencv)test.cpp -o Test 跟踪/ BPT陷阱:5
brewdoctor给了我这个警告: 警告:您的酒窖中有未链接的桶 让桶没有链接可能导致构建问题并导致依赖的酿造 一旦建成,那些桶就无法正常运行。在这些上运行brew link
:
opencv
所以我运行brew链接--overwrite opencv但得到了这个:
Linking /usr/local/Cellar/opencv/2.4.9...
Error: Could not symlink include/opencv/cv.h
需要覆盖,因为brew链接opencv给出了
Linking /usr/local/Cellar/opencv/2.4.9...
Error: Could not symlink include/opencv/cv.h
Target /usr/local/include/opencv/cv.h
already exists. You may want to remove it:
rm /usr/local/include/opencv/cv.h
答案 0 :(得分:37)
您收到链接器错误。我认为这是因为您没有链接opencv
所需的正确库。
获取正确库的最简单方法是pkg-config
,所以我建议:
brew install pkg-config
然后你可能需要重新安装opencv
brew reinstall opencv
或者
brew uninstall opencv
brew install opencv
然后你应该能够做到:
g++ $(pkg-config --cflags --libs opencv) test.cpp -o Test
你可以运行
pkg-config --cflags --libs opencv4
如果您感兴趣,可以查看它为g++
编译器输出的内容 - 它告诉编译器库和头文件的位置。在我的系统上,它输出:
pkg-config --cflags --libs opencv4
-I/usr/local/Cellar/opencv/2.4.12_2/include/opencv \
-I/usr/local/Cellar/opencv/2.4.12_2/include \
-L/usr/local/Cellar/opencv/2.4.12_2/lib \
-lopencv_calib3d -lopencv_contrib -lopencv_core -lopencv_features2d -lopencv_flann -lopencv_gpu -lopencv_highgui -lopencv_imgproc -lopencv_legacy -lopencv_ml -lopencv_nonfree -lopencv_objdetect -lopencv_ocl -lopencv_photo -lopencv_stitching -lopencv_superres -lopencv_ts -lopencv_video -lopencv_videostab
如果您不熟悉pkgconfig
,可以要求它告诉您它所知道的所有包裹:
pkg-config --list-all
我的系统提供如下输出:
libzmq libzmq - 0MQ c++ library
gio-unix-2.0 GIO unix specific APIs - unix specific headers for glib I/O library
glibmm-2.4 glibmm - C++ wrapper for GLib
libpostproc libpostproc - FFmpeg postprocessing library
libgsf-1 libgsf-1 - A library for reading and writing structured files (eg MS OLE and Zip)
gobject-introspection-no-export-1.0 gobject-introspection - GObject Introspection
libtasn1 libtasn1 - Library for ASN.1 and DER manipulation
libusb-1.0 libusb-1.0 - C API for USB device access from Linux, Mac OS X, Windows and OpenBSD/NetBSD userspace
gio-2.0 GIO - glib I/O library
libusb libusb - USB access library (libusb-1.0 compat wrapper)
libecpg_compat libecpg_compat - PostgreSQL libecpg_compat library
QtNetwork Qtnetwork - Qtnetwork Library
opencv4 OpenCV - Open Source Computer Vision Library
基本上,上面列表中每行的第一个单词告诉你pkgconfig
知道的包的名称,这是你在运行命令时应该指定的名称,如
pkg-config --cflags --libs opencv4
如果您的系统有点乱,您可以找到.pc
使用的pkgconfig
文件:
find /usr/local/Cellar -name \*.pc
或
find /usr/local/Cellar -name \*.pc | grep -i opencv
/usr/local/Cellar/opencv3/3.1.0_3/lib/pkgconfig/opencv.pc
然后直接使用配置文件,如下所示:
pkg-config --cflags --libs /usr/local/Cellar/opencv3/3.1.0_3/lib/pkgconfig/opencv.pc
如果一切正确编译,您可以使用
运行它./test
答案 1 :(得分:9)
您收到这些错误是因为您在代码中使用了未链接到项目的 OpenCV 方法。
到目前为止,您只包括:
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
但是要运行您的代码,您需要的远远超过这两个 OpenCV 库。例如,在尝试在XCODE中构建项目时,我们会出现以下错误:
Undefined symbols for architecture x86_64:
"cv::imread(cv::String const&, int)", referenced from:
_main in main.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
对应于错误的这一部分:
... "cv::imread(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, int)", referenced from:
_main in test-41a30e.o ...
这是因为XCODE希望在您的代码中执行以下函数:
Mat img = imread("my_image.jpg", CV_LOAD_IMAGE_UNCHANGED);
但是你实现它的方式,它不知道 imread()是什么,因为缺少对 opencv 库的引用!解决这个特殊问题的图书馆是:
libopencv_imgcodecs.3.1.0.dylib
(当然,版本取决于您使用的 OpenCV 的任何版本。)
要解决此特定错误,您必须执行以下两个步骤:
/Users/YOURNAME/YOURFOLDER/opencv-3.1.0/build/lib
小心!这可能取决于您如何安装OpenCV!如果你使用Homebrew安装它。目录应该在这里:
/usr/local/Cellar/opencv/2.4.9/lib
选择以下库(libopencv_imgcodecs.3.1.0.dylib)并将其添加到您的项目中:
将库添加到项目后,它应显示在左侧列表中。 Double检查您是否选择了正确的库。其中一些名字非常相似!
正如你所做的那样:
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
您现在应该继续并包含新的库:
#include "opencv2/imgcodecs/imgcodecs.hpp"
再次构建程序时,应该少一个错误。并且XCODE应该没有问题来运行 cv :: imread 。
由于您有很多错误,现在应该继续检查成功构建程序所需的库。
我建议链接这些库,因为它们很常见:
#include <iostream>
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/core/core.hpp"
#include "opencv2/video/video.hpp"
#include "opencv2/imgcodecs/imgcodecs.hpp"
在对所有错误进行疯狂之前,您可以链接所有库并查看它是否正确构建。
答案 2 :(得分:0)
我的问题是brew编译并与Xcode链接,并且我使用的是与Macports不同的g ++版本。我只是将Xcode g ++位置添加到了$PATH
文件中的.bash_profile
变量中,并用sudo port select --set gcc none
取消了错误的g ++二进制文件的链接。您可以通过运行xcodebuild -find g++
找到Xcode g ++的位置,我的位置是/Applications/Xcode.app/Contents/Developer/usr/bin/g++
。