过去一周,我一直在尝试使用终端运行一些简单的OpenCV程序。我已尝试过各种论坛的许多教程和建议,但收效甚微。尝试将OpenCV头文件链接到我的OpenCV主程序时出现问题。对于一个简单的c ++程序,我只需执行g++ main.cpp header.hpp
来生成可执行的程序。如何链接必要的OpenCV头文件,例如<opencv2/highgui/highgui.hpp>
&amp; <opencv2/core/core.hpp>
?
例如,当尝试从http://docs.opencv.org/2.4/doc/tutorials/introduction/display_image/display_image.html执行示例程序时,会发生以下情况:
桌面Robert $ g ++ loadIMG.cpp 架构x86_64的未定义符号: &#34; cv :: namedWindow(cv :: String const&amp;,int)&#34;,引自: _main in loadIMG-54c517.o &#34; cv :: Mat :: deallocate()&#34;,引自: loadIMG-54c517.o中的cv :: Mat :: release() &#34; cv :: Mat :: copySize(cv :: Mat const&amp;)&#34;,引自: loadIMG-54c517.o中的cv :: Mat :: operator =(cv :: Mat const&amp;) &#34; cv :: String :: deallocate()&#34;,引自: loadIMG-54c517.o中的cv :: String :: ~String() &#34; cv :: String :: allocate(unsigned long)&#34;,引自: loadIMG-54c517.o中的cv :: String :: String(char const *) &#34; cv :: imread(cv :: String const&amp;,int)&#34;,引自: _main in loadIMG-54c517.o &#34; cv :: imshow(cv :: String const&amp;,cv :: _ InputArray const&amp;)&#34;,引自: _main in loadIMG-54c517.o &#34; cv :: waitKey(int)&#34;,引自: _main in loadIMG-54c517.o &#34; cv :: fastFree(void *)&#34;,引自: loadIMG-54c517.o中的cv :: Mat :: ~Mat() ld:找不到架构x86_64的符号 clang:错误:链接器命令失败,退出代码为1(使用-v查看调用)
请注意:OpenCV已经使用以下教程构建:http://blogs.wcode.org/2014/10/howto-install-build-and-use-opencv-macosx-10-10/
任何帮助或指示都将不胜感激。谢谢。
答案 0 :(得分:3)
您还没有指定:
-I"/path/to/your/include"
我在/opt/local/include
中有opencv标头,在/opt/local/lib
中有图书馆,
所以编译一个这样的基本程序:
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main( int argc, char** argv )
{
Mat src = Mat(Size(320,240),CV_64F);;
namedWindow("test");
cout << "press any key to close" << endl;
while(true){
randn(src,0,1.0);
imshow("test",src);
if(waitKey() > 0) break;
}
}
我这样编译:
g++ main.cpp -I"/opt/local/include/" -L"/opt/local/lib/" -lopencv_core -lopencv_highgui -o main
然后运行./main
:
请记住,您可能在/usr/local
文件夹中安装了opencv而不是/opt/local
,具体取决于您编译/安装OpenCV的方式。
此外,您可能安装了pkg-config,当您需要链接更多库时,它可以派上用场。
例如,您可以运行:
pkg-config --libs --cflags opencv
在我的案例中输出:
-I/opt/local/include/opencv -I/opt/local/include -L/opt/local/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_photo -lopencv_stitching -lopencv_superres -lopencv_ts -lopencv_video -lopencv_videostab
但在您的情况下,它应该输出您的特定OpenCV路径。
这将简化编译:
g++ main.cpp `pkg-config --libs --cflags opencv` -o main
您链接的指南使用cmake
为您生成Makefile。
这是另一个不错的选择。此外,基于相同的指南,您应该安装XCode,您可以使用它来创建命令行工具并指向标题搜索路径和库搜索路径。
答案 1 :(得分:0)
我创建了一个类似的文件,可以帮助你。
首先我使用:
sudo brew install opencv
然后根据终端提供的提示安装opencv.3.0
。然后在需要来自.cpp
的API的opencv
文件中,我使用:
#include "opencv2/opencv.hpp"
作为我唯一包含opencv
的文件。实际上,在该项目中,我使用highgui
,core
和imgprog
。但不用担心,我会告诉你如何在链接部分解决它们。
完成项目后,您将在终端上编译项目。
因为我也使用了JNI接口,所以我仍然需要链接 jni.h 。
我们走了:
g++ xxxx.cpp xxx.cpp -lstdc++ -fPIC -shared (to create a shared object)
-I/absolute path/ (we can use -I to be followed with the absolute path of the library you need to use )
-I/Users/yuanzhan/Downloads/OpenCV-2.0.0/src/
-I /Users/yuanzhan/Downloads/OpenCV-2.0.0/include/opencv/ -I/usr/local/Cellar/opencv3/3.1.0_3/lib -lopencv_core (open the library for use if you use the API fro here)-lopencv_highgui -lopencv_imgproc -L.(i put the cv2. on local otherwise you can add the absolute path here) -lcv2(use the package) -v -o libopenCvSDK.so(generate my .so package).