OpenCV 无法在自定义目录中编译

Posted

技术标签:

【中文标题】OpenCV 无法在自定义目录中编译【英文标题】:OpenCV cannot compile in custom directory 【发布时间】:2016-11-10 11:55:29 【问题描述】:

我在 Ubuntu 上,想在自定义目录上安装不同版本的 OpenCV(2.4.13)。我在这里学习了本教程:http://code.litomisky.com/2014/03/09/how-to-have-multiple-versions-of-the-same-library-side-by-side/

我无法编译这个简单的 main.cpp 程序。我无法创建 cv::Mat 图像,但我可以获得 OpenCV 版本就好了!:

#include <iostream>
#include <opencv2/core/version.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>

int main(int argc, char ** argv)

std::cout << "OpenCV version: "
        << CV_MAJOR_VERSION << "." 
        << CV_MINOR_VERSION << "."
        << CV_SUBMINOR_VERSION
        << std::endl;

cv::Mat image; //without this line, it works!


return 0;

这是我的生成文件:

CPP = g++ -std=c++0x

# OpenCV 2.4.13
CPPFLAGS = -L/home/myname/Desktop/myfolder/rewrite/opencv-2.4.13/release/installed/lib  \
           -I/home/myname/Desktop/myfolder/rewrite/opencv-2.4.13/release/installed/include


all: test

test: main.cpp
     $(CPP) $(CPPFLAGS) $^ -o $@

这是编译器错误:

/tmp/ccyrdd7H.o: In function `cv::Mat::~Mat()':
main.cpp:(.text._ZN2cv3MatD1Ev[cv::Mat::~Mat()]+0x39): undefined reference to `cv::fastFree(void*)'
/tmp/ccyrdd7H.o: In function `cv::Mat::release()':
main.cpp:(.text._ZN2cv3Mat7releaseEv[cv::Mat::release()]+0x47): undefined reference to `cv::Mat::deallocate()'
collect2: ld returned 1 exit status
make: *** [test] Error 1

【问题讨论】:

【参考方案1】:

您的Makefile 错误。 -L & -l 选项在链接时是相关的(但在编译时不是)。请参阅this 和that 答案和示例(都与您的问题非常相似,并显示您应该能够适应的Makefile)。运行make -p,了解它们使用的内置规则和变量。

(我猜你是在 Linux 上)

阅读有关ELF、linkers 和dynamic linkers、object files、executables 等的更多信息。请参阅莱文的Linkers and loaders 书。

顺便说一句,CV_MAJOR_VERSION 等...可能是在某些标头中定义的macro(由您的某些#include directives 提及)。但cv::Mat 可能是一些真正的 C++ 类,具有构造函数或在链接时引用的 vtable。

也许您还应该阅读一本关于 C++ 的好书,例如Programming -- Principles and Practice Using C++;但我们没有时间和空间在这里解释所有这些。

【讨论】:

您好,感谢您的评论。为什么我用这个makefile可以得到版本号,却不能用完全相同的makefile做一个cv::Mat? 你在说哪个Makefile【参考方案2】:

makefile 应该是这样的:

CPP = g++ -std=c++0x

# OpenCV trunk
CPPFLAGS = -L/home/myname/Desktop/myfolder/rewrite/opencv-2.4.13/release/installed/lib -lopencv_core -lopencv_highgui -lopencv_imgproc  \
           -I/home/myname/Desktop/myfolder/rewrite/opencv-2.4.13/release/installed/include

all: test

test: main.cpp
    $(CPP) $(CPPFLAGS) $^ -o $@

标志 -lopencv_core -lopencv_highgui -lopencv_imgproc 丢失。

在不同的目录中安装opencv,您可能会遇到无法访问的共享库错误。在这种情况下,请按照此处的说明进行操作:openCV program compile error "libopencv_core.so.2.4: cannot open shared object file: No such file or directory" in ubuntu 12.04

【讨论】:

以上是关于OpenCV 无法在自定义目录中编译的主要内容,如果未能解决你的问题,请参考以下文章

在自定义类中使用setMouseCallBack

无法在自定义 UITableViewCell 中更新 UITextView 的文本

无法在自定义 TableViewCell 中编辑 UITextView

无法在自定义 NSViewController 中注册鼠标事件

在自定义目标运行后重建依赖目标

无法在自定义配置文件提供程序中加载类型