OpenCV 2.4.8编译和链接错误

时间:2014-03-15 01:26:03

标签: c++ opencv compiler-errors

我是OpenCV的初学者,我必须从源代码编译,因为我在HPC机器上的帐户上使用它。我在本地编译它,以便它存在于~/ext下的我的主目录中。现在我正在尝试编译simple example from this documentation page,但是我在编译和链接我的新的本地openCV安装时遇到了麻烦。

以下是test.cpp文件中的代码:

#include <stdio.h>
#include <opencv2/opencv.hpp>

using namespace cv;

int main( int argc, char** argv )
{
  Mat image;
  image = imread( argv[1], 1 );

  if( argc != 2 || !image.data )
    {
      printf( "No image data \n" );
      return -1;
    }

  namedWindow( "Display Image", WINDOW_AUTOSIZE );
  imshow( "Display Image", image );

  waitKey(0);

  return 0;
}

这是我简单的Makefile:

CC = g++
SRC = test.cpp
EXEC = test

CFLAGS = -I/home/my_username/ext/include/
LFLAGS = -L/home/my_username/ext/lib/ -lcxcore -lcv -lhighgui -lcvaux -lml

# YOU PROBABLY DO NOT HAVE TO CHANGE ANYTHING BELOW THIS LINE.

# This generates a list of object file names from the source file names
OBJ = $(addsuffix .o, $(basename $(SRC)))

# "make" makes the executable.
$(EXEC): $(OBJ)
    $(CC) $(LFLAGS) $(OBJ) -o $(EXEC)

# This says how to build an object (.o) file from a source (.c) file
%.o : %.cpp
    $(CC) $(CFLAGS) -c $< -o $@

# "make clean" deletes objects and executable
clean:
    rm -f $(EXEC) *.o 

使用此配置时,我尝试make时收到以下错误。

g++ -I/home/kjorg50/ext/include/ -c test.cpp -o test.o
g++ -L/home/kjorg50/ext/lib/ -lcxcore -lcv -lhighgui -lcvaux -lml test.o -o test
test.o: In function `main':
test.cpp:(.text+0x1c7): undefined reference to `cv::_InputArray::_InputArray(cv::Mat const&)'
test.cpp:(.text+0x1fb): undefined reference to `cv::imshow(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, cv::_InputArray const&)'
test.o: In function `cv::Mat::operator=(cv::Mat const&)':
test.cpp:(.text._ZN2cv3MataSERKS0_[cv::Mat::operator=(cv::Mat const&)]+0x111): undefined reference to `cv::Mat::copySize(cv::Mat const&)'
test.o: In function `cv::Mat::release()':
test.cpp:(.text._ZN2cv3Mat7releaseEv[cv::Mat::release()]+0x47): undefined reference to `cv::Mat::deallocate()'
collect2: ld returned 1 exit status
make: *** [test] Error 1

我很确定我错过了一些#include语句,或者我的CFLAGS和/或LFLAGS值不正确。 那么,有人会知道我在编辑中缺少哪些库文件吗?

编辑 - 为了让它编译我必须添加到我的LIBRARY_PATHLD_LIBRARY_PATH env变量的正确路径

3 个答案:

答案 0 :(得分:1)

Here's a pretty decent reference on makefiles

在您发表评论之后,我使用上面的参考来创建一个Makefile,它在我的系统上编译代码(尽管它在运行时会抛出一个逻辑错误)。我原本以为你的库的排序可能是错的。这是正确的,因为gnu C ++编译器需要排序,你的库引用需要最后。但是,它看起来至少与最新的Ubuntu opencv库一样,你也没有正确的库名。

你有:

# "make" makes the executable.
$(EXEC): $(OBJ)
    $(CC) $(LFLAGS) $(OBJ) -o $(EXEC)

将其更改为:

$(EXEC): $(OBJ) 
    $(CC) -o $(EXEC) $(OBJ) $(LFLAGS)

LFLAGS

LFLAGS = -L/home/my_username/ext/lib/ -lopencv_core -lopencv_highgui 

试一试,让我知道它是怎么回事。如果这不起作用,那么您没有使用-L命令引用库的正确位置。当我使用aptitude在我的系统上安装它们时,它们位于/usr/lib文件夹中。

答案 1 :(得分:0)

要进行编译,我必须将/home/my_username/ext/lib/添加到LIBRARY_PATHLD_LIBRARY_PATH环境变量中。我是通过将其添加到我的~/.bashrc文件中完成的。

我现在有其他与opencv相关的运行时错误,但这些错误与编译问题无关。

答案 2 :(得分:0)

我使用g++ "pkg-config opencv --libs" main.cpp -o main编译我的OpenCV代码。

这是pkg-config opencv --libs命令的输出:

-lopencv_calib3d
-lopencv_contrib
-lopencv_core
-lopencv_features2d
-lopencv_flann
-lopencv_gpu
-lopencv_highgui
-lopencv_imgproc
-lopencv_legacy
-lopencv_ml
-lopencv_objdetect
-lopencv_ocl
-lopencv_photo
-lopencv_stitching
-lopencv_superres
-lopencv_ts
-lopencv_video
-lopencv_videostab

我想你需要更正库名,以便编译代码。

此外,我非常确定您没有错过任何包含,因为您使用了包含所有opencv标头的#include <opencv2/opencv.hpp>