使用g++编译opencv程序

在centos6.9下安装好opencv3.2.库后,写了第一个显示图片的小程序,结果linux下的编译问题让我折腾了大半天。ShowImage.cpp程序如下:

#include 
#include 
#include 

int main()
{
        cv::Mat image;
        image= cv::imread("twins.jpg");
        if(image.empty())
        {
                printf("no image exist");
                return 0;
        }
        cv::namedWindow("Original Image");
        cv::imshow("Original Image",image);
        cv::waitKey(0);
        return 0;
}

编译过程:

export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
g++ $(pkg-config --libs --cflags opencv) ShowImage.cpp -o ShowImage
./ShowImage

其中遇到的问题:

1,使用pkg-config的原因

g++编译c++程序时,需要用-L-I来分别制定连接库和头文件信息,但是opencv库文件和头文件繁多,不可能每次编译都写上一堆连接信息,而且不同人可能会安装在不同路径,查找也困难,于是需要使用pkg-config工具来自动找出依赖库和头文件信息,仅需输入pkg-config–libs –cflags opencv


2,输入pkg-config –libs –cflags opencv命令查找opencv依赖项时报错如下:

Package opencv was not found in the pkg-config search path.
Perhaps you should add the directory containing `opencv.pc'
to thePKG_CONFIG_PATH environment variable
No package 'opencv'found

在pkg-config的搜索路径下找不到opencv库,可能需要将包含opencv.pc的目录添加到PKG_CONFIG_PATH环境变量中。

那么,执行完export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig/:$PKG_CONFIG_PATH之后,再执行pkg-config–libs –cflags opencv结果如下:

[jello@jello ShowImage]$ pkg-config --libs --cflags opencv
-I/usr/local/include/opencv -I/usr/local/include  -L/usr/local/lib -lopencv_shape -lopencv_stitching -lopencv_objdetect -lopencv_superres -lopencv_videostab -lopencv_calib3d -lopencv_features2d -lopencv_highgui -lopencv_videoio -lopencv_imgcodecs -lopencv_video -lopencv_photo -lopencv_ml -lopencv_imgproc -lopencv_flann -lopencv_core 

可以看到:由于使用了pkg-config工具来获得库的选项,所以不论库安装在什么目录下,都可以使用相同的编译和连接命令,带来了编译和连接界面的统一。

3, pkg-config的信息从哪来

第一种:取系统的/usr/lib下的所有*.pc文件。

第二种:PKG_CONFIG_PATH环境变量所指向的路径下的所有*.pc文件。

第一种系统的/usr/lib路径是所有程序都会自动搜索的路径,不需要写在环境变量中。

那么,pc文件到底写了什么? 比如/usr/local/lib/pkgconfig/opencv.pc

# Package Information for pkg-config

prefix=/usr/local
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir_old=${prefix}/include/opencv
includedir_new=${prefix}/include

Name: OpenCV
Description: Open Source Computer Vision Library
Version: 3.2.0
Libs: -L${exec_prefix}/lib -lopencv_shape -lopencv_stitching -lopencv_objdetect -lopencv_superres -lopencv_videostab -lopencv_calib3d -lopencv_features2d -lopencv_highgui -lopencv_videoio -lopencv_imgcodecs -lopencv_video -lopencv_photo -lopencv_ml -lopencv_imgproc -lopencv_flann -lopencv_core
Libs.private: -L/usr/lib -lpng -lz -ltiff -ljasper -ljpeg -lgtk-x11-2.0 -lgdk-x11-2.0 -latk-1.0 -lgio-2.0 -lpangoft2-1.0 -lpangocairo-1.0 -lgdk_pixbuf-2.0 -lcairo -lpango-1.0 -lfreetype -lfontconfig -lgstbase-0.10 -lgstreamer-0.10 -lgobject-2.0 -lgmodule-2.0 -lxml2 -lgthread-2.0 -lglib-2.0 -ldc1394 -ldl -lm -lpthread -lrt
Cflags: -I${includedir_old} -I${includedir_new}

4,执行编译好的ShowImage时出错

./ShowImage: error while loading shared libraries: libopencv_shape.so.3.2: cannot open shared object file: No such file or directory

显示找不到库文件,即是LD_LIBRARY_PATH未添加/usr/local/lib的原因,同样,系统路径/usr/lib是不需要添加而自动搜索的。

注意,环境变量的的设置只对当前终端窗口有效。

你可能感兴趣的:(C++,opencv,linux)