【问题标题】:OpenCV 2.4.8 compiling and linking errorOpenCV 2.4.8 编译和链接错误
【发布时间】:2015-06-18 12:56:27
【问题描述】:

我是 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 环境变量中

【问题讨论】:

  • 附带说明,您应该在尝试使用 argv[1] 作为文件名读取图像之前测试参数的数量,而不是在它之后。
  • @lightalchemist 谢谢我意识到这一点,但我不太关心这个 c++ 代码。我更关心的是能够用这个本地安装编译一个 openCV 程序。

标签: c++ opencv compiler-errors


【解决方案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 文件夹中。

【讨论】:

  • 另外,我认为您混淆了普通 Makefile 的 CFLAGS 和 INCLUDES 部分。通常,您会将这些包含在上面的行中,就像在发布的示例中一样,您的 C 标志可能类似于 -Wall -g
  • 实际上我把库的名称弄错了,-lopencv_core-lopencv_highgui 有效!但是,现在我在运行程序时收到以下错误:./test: error while loading shared libraries: libopencv_core.so.2.4: cannot open shared object file: No such file or directory
【解决方案2】:

为了让它编译,我必须将/home/my_username/ext/lib/ 添加到LIBRARY_PATHLD_LIBRARY_PATH 环境变量中。我通过将其添加到我的 ~/.bashrc 文件中来做到这一点。

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

【讨论】:

    【解决方案3】:

    我使用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 &lt;opencv2/opencv.hpp&gt;

    【讨论】:

      猜你喜欢
      • 2014-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-26
      • 2020-08-26
      • 2012-12-31
      • 2012-08-01
      相关资源
      最近更新 更多