我是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_PATH
和LD_LIBRARY_PATH
env变量的正确路径
答案 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_PATH
和LD_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>
。