在ubuntu下使用cmake进行opencv的配置和Windows下进行使用cmake编译源代码比较,opencv3进行g++例子程序编译、动态库的制作

1.首先安装的是cmake软件,使用指令:

apt-get install cmake
接着查看版本,测试是否安装成功:
root@emouse:/home# cmake --version
cmake version 2.8.10.2

由于我们需要时有的是cmake界面来配置,所以我么要安装器ui界面,其指令是:

apt-get install cmake-gui
如果觉得自带的cmake版本不符合要求,可以自行下载安装包,其安装过程是:
下载最新版的安装包:
http://www.cmake.org/cmake/resources/software.html
这里下载已经编译好的,这样只需要解压至需要的目录下即可使用:
tar zxvf cmake-2.8.10.2-Linux-i386.tar.gz –C /usr/local/
设置环境变量:
sudo gedit /home/emouse/.bashrc
在打开的文件后添加:
export PATH=$PATH:/usr/local/cmake-2.8.10.2-Linux-i386/bin
安装完成后就可以使用上面通过检查其版本来看是否安装完成。

2、先安装 libgtk2.0-dev 和 pkg-config,,否则后期编译运行程序会出现类似如下的问题:
OpenCV Error: Unspecified error (The function is not implemented. Rebuild the library with Windows, GTK+ 2.x or Carbon support. If you are on Ubuntu or Debian, install libgtk2.0-dev and pkg-config, then re-run cmake or configure script) in cvNamedWindow, file /usr/local/opencv/OpenCV-2.0.0/src/highgui/window.cpp, line 100
terminate called after throwing an instance of 'cv::Exception'
通过网络获取安装:

# apt-get install libgtk2.0-dev
# apt-get install pkg-config

2、下载OpenCV ,文件名:OpenCV-2.4.3.tar.bz2,下载地址:
http://www.opencv.org.cn/index.php/Download
解压:
#tar jxvf OpenCV-2.4.3.tar.bz2
得到文件夹 OpenCV-2.4.3

此时在同级目录下新建一个文件夹opencv-x86作为PC编译目录,记住其实这个文件是为了存放一些编译过程生成的杂碎文件和一个最重要的makefile文件。

注意:不过现在的opencv提供的linux不是tar包了,而是zip包,其解压指令要使用unzip,当使用cd定位到文件所在目录后,使用指令为:unzip OpenCV-2.4.4.zip  

3、#cmake-gui 打开cmake的gui界面,开始进行配置。
cmake主要用于进行一些配置设定,从而生成用于编译安装的makefile文件,通过界面进行参数的配置和设定,非常直观、方便。在配置中指定源码和编译目录以及生成方式。
按照下图的步骤进行配置:

点击Finish后cmake即载入默认配置,如下图所示:

当第一次configure配置完后,再次点击configure,最后点击generate,当出现有generate Done则表示完成。其中的/usr/local是用于存放生成的lib与dll文件,上面的CONFIGURATION_TYPES指的是进行两钟模式的lib和dll文夹生成,其是这一步还不会生成lib和dll,而是生成makefile文件,里面包含了我们的一些设置,为了生成lib和dll。下图是我们在Windows下安装opencv后自带的库文件目录(这是opencv以为我们编译好的,所以我们可以直接使用,而不需再自行编译产生库文件,但是当VS的版本与opencv的版本不兼容时,可以自行编译产生相应的库文件来解决)


另一种通过终端指令来配置相应的参数来生成makefile文件:

$ cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/home/OpenCV  

(这里的PREFIX路径是自己定义的位置,其替代了默认路径/usr/local)如果使用全部使用默认路径则可以直接使用指令:

cmake .
注意别忘了这个点。只是这里通过图形界面的方式来进行配置,更加直观方便。

4.接下来使用cd定位到opencv-x86文件夹下使用指令:

make
make install

这上面的两条指令主要是为了对应编译器下的dll、lib文件,我们可以通过指令来查看make是否成功,然后再执行make install指令,检测正确与否指令是:

<span style="font-size:18px;">echo  $?</span>

     输入这条命令回车后,输出的结果是0,那么就说明成功编译,否则就是出错了,echo  $?表示检查上一条命令的退出状态,程序正常退出返回0!所以这是为什么我们的main函数要有返回值并且是正确返回0。

其跟我们在Windows下使用cmake生成库的步骤相同,其在使用cmake后也分为两步:

第一步:在debug模式下,选择解决方案“Opencv”,点击右键,运行“重新生成解决方案”;

第二步:生成成功后,再CMakeTargets目录下选择INSTALL,右键运行。

而release模式下也是这样子的两个步骤即可,其流程图如下:



5.接下来就是配置lib库:

 在linux系统下安装了带有动态库的程序后,会在ld.so.conf.d文件目录下生产相应程序的.conf文件,其里面包含了

此软件运行需要装载的动态库路径,所以我们需要把我们使用cmake配置时的路径,我们使用的是默认路径,则我们的指令是:

sudo gedit /etc/ld.so.conf.d/opencv.conf
打开配置文件后就输入路径(这个文件夹一般是空的),其为:

/usr/local/lib
注意:在默认路径下在生成lib是会自动生成一个lib文件夹的。完成上的步骤后,这里的库文件仍然不能被调用,因为为linux系统的特性是,新加载的库文件需要缓存到一个叫ld.so.cache文件里(其里面包含了/etc/ld.so.conf中指定的目录中查找到的所有的库,按顺序排列),否则使用该软件是会报错 ,说缺少xxx库,而使用的指令是:

ldconfig

 

6.最后配置环境变量

其中pkgconfig文件夹里包含了软件的.pc文件,这个是包含了库的路径之类得东西,使用的指令是:

gedit /etc/bash.bashrc
在文件后添加:

PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig 
export PKG_CONFIG_PATH
保存退出, 重启计算机后就可以使用opencv例程来测试配置成功与否。

下面的一些是一些小知识,看与不看都可以,可以直接进入步骤7环节,其中ubuntu里的文件名字与其他linux系统有些差别,其如下:





注意:  在默认情况下,每个支持 pkgconfig 的库对应的 .pc 文件在安装后都位于安装目录中的 lib/pkgconfig 目录下。例如,我们在上面已经将 Glib 安装在 /opt/gtk 目录下了,那么这个 Glib 库对应的 .pc 文件是 /opt/gtk/lib/pkgconfig 目录下一个叫 glib-2.0.pc 的文件,这里面包含有软件的库lib位置,dll位置等,其内容为:

prefix=/opt/gtk/
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir=${prefix}/include

glib_genmarshal=glib-genmarshal
gobject_query=gobject-query
glib_mkenums=glib-mkenums

Name: GLib
Description: C Utility Library
Version: 2.12.13
Libs: -L${libdir} -lglib-2.0 
Cflags: -I${includedir}/glib-2.0 -I${libdir}/glib-2.0/include 
注意:为什么需要配置上面的路径呢?因为其是为了加快库的读取。

下面以Glib库为例子:

安装完 Glib 后,在 bash 中应该进行如下设置:

$ export PKG_CONFIG_PATH=/opt/gtk/lib/pkgconfig:$PKG_CONFIG_PATH

可以执行下面的命令检查是否 /opt/gtk/lib/pkgconfig 路径已经设置在 PKG_CONFIG_PATH 环境变量中:

$ echo $PKG_CONFIG_PATH

这样设置之后,使用 Glib 库的其它程序或库在编译的时候 pkg-config 就知道首先要到 /opt/gtk/lib/pkgconfig 这个目录中去寻找 glib-2.0.pc 了(GTK+ 和其它的依赖库的 .pc 文件也将拷贝到这里,也会首先到这里搜索它们对应的 .pc 文件)。之后,通过 pkg-config 就可以把其中库的编译和连接参数提取出来供程序在编译和连接时使用。

7.使用opencv例子程序来进行测试配置成功与否。

先在root目录下建立一个opencv_samples文件,然后把opencv自带的C文件夹下的例子程序复制到opencv_samples文件夹下,

其中在make install过程时会默认把资源文件放到/usr/local/share/OpenCV/文件下,其里面包含的内容是一些人脸、人眼级联器等数据,所以复制文件的指令是:

cd ~
mkdir openCV_samples
cp OpenCV-2.1.0/samples/c/* openCV_samples
cd openCV_samples/
chmod +x build_all.sh
./build_all.sh
接着就是执行可执行文件,在当前目录下使用 ls 指令来查看哪些文件是可以运行的(一般可执行文件的颜色是不同的),接着就是执行它,并输入一些数据,如下:

./facedetect --cascade="/usr/local/share/OpenCV/haarcascades/haarcascade_frontalface_alt.xml" --scale=1.5 lena.jpg
结果为:




8.到此步位置如果没问题的话,opencv的配置已经完成,但是我们如何判断配置没有问题呢?

我们通过如下指令:

pkg-config --cflags opencv
输出结果为:


解释:上面的指令指的是输出opencv.pc里面的头文件路径,因为在编译程序的时候需要把头文件的路径、库文件告诉编译器,在include包含的头文件才不会出现未定义的情况。

第二个指令是:

pkg-config --libs opencv
输出结果为:


这条指令的作用是把所需的库文件进行加载进来,而不是纯粹的指出路径。如果这两条指令都有结果输出,则证明opencv的配置路径正确,

下面主要是对自己写的例子进行编译,刚开始我使用的是opencv打开摄像头然后抓取帧进行显示的例子,当时遇到了两个问题,第一个就是编译,没有区别gcc、g++。第二个是opencv自身读取摄像头的接口问题,出现读取的图像乱码等,要使用V4l2。

首先,我使用的是opencv3里的例程,例子随便,正确的编译指令是使用g++,为:


其中包含pkg的两个点是键盘左上角的那个按键---这个很重要,还有就是这两个pkg在linux下使用了第三方库时都是必须写上去的,
到此步位置,祝贺完成任务。

     小知识:就是关于修改了bash.bashrc里的文件后,因为其是开机时加载的,修改后要生效就必须重新加载,有两个办法:第一重新开机;第二使用指令 source /etc/bash.bash.rc  其中的source也可以使用‘ . ’黑点代替。

     接着就是里面加载pkgconfig文件的方法,因为我们的**.pc文件是存在pkgconfig文件夹下的,所以我们需要在bash.bashrc文件(这个文件是ubuntu系统里的,其它系统的文件可能不一样,我们只是需要把其pc文件的加载路径放大开机加载的文件里就行)里指出其路径,我的指令是:


其中,pkg_congfig_path名字可以修改的,

其中linux下的动态库与静态库的制作:

linux 下动态链接库的制作与使用
动态链接库*.so的编译与使用- -
动态库*.so在linux下用c和c++编程时经常会碰到,最近在网站找了几篇文章介绍动态库的编译和链接,总算搞懂了这个之前一直不太了解得东东,这里做个笔记,也为其它正为动态库链接库而苦恼的兄弟们提供一点帮助。
1、动态库的编译
下面通过一个例子来介绍如何生成一个动态库。这里有一个头文件:so_test.h,三个.c文件:test_a.c、test_b.c、test_c.c,我们将这几个文件编译成一个动态库:libtest.so。
so_test.h:
#include <stdio.h>
#include <stdlib.h>
void test_a();
void test_b();
void test_c();
test_a.c:
#include "so_test.h"
void test_a()
{
printf("this is in test_a...\n");
}
test_b.c:
#include "so_test.h"
void test_b()
{
printf("this is in test_b...\n");
}
test_a.c:
#include "so_test.h"
void test_c()
{
printf("this is in test_c...\n");
}
将这几个文件编译成一个动态库:libtest.so
$ gcc test_a.c test_b.c test_c.c -fPIC -shared -o libtest.so
2、动态库的链接
在1、中,我们已经成功生成了一个自己的动态链接库libtest.so,下面我们通过一个程序来调用这个库里的函数。程序的源文件为:test.c。
test.c:
#include "so_test.h"
int main()
{
test_a();
test_b();
test_c();
return 0;
}
       将test.c与动态库libtest.so链接生成执行文件test:
$ gcc test.c -L. -ltest -o test
       测试是否动态连接,如果列出libtest.so,那么应该是连接正常了
$ ldd test
       执行test,可以看到它是如何调用动态库中的函数的。
3、编译参数解析
最主要的是GCC命令行的一个选项:
      -shared 该选项指定生成动态连接库(让连接器生成T类型的导出符号表,有时候也生成弱连接W类型的导出符号),不用该标志外部程序无法连接。相当于一个可执行文件
       -fPIC:表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的所以动态载入时是通过代码拷贝的方式来满足不同进程的需要,而不能达到真正代码段共享的目的。
       -L.:表示要连接的库在当前目录中
       -ltest:编译器查找动态连接库时有隐含的命名规则,即在给出的名字前面加上lib,后面加上.so来确定库的名称
       LD_LIBRARY_PATH:这个环境变量指示动态连接器可以装载动态库的路径。
       当然如果有root权限的话,可以修改/etc/ld.so.conf文件,然后调用 /sbin/ldconfig来达到同样的目的,不过如果没有root权限,那么只能采用输出LD_LIBRARY_PATH的方法了。
4、注意
   调用动态库的时候有几个问题会经常碰到,有时,明明已经将库的头文件所在目录 通过 “-I” include进来了,库所在文件通过 “-L”参数引导,并指定了“-l”的库名,但通过ldd命令察看时,就是死活找不到你指定链接的so文件,这时你要作的就是通过修改LD_LIBRARY_PATH或者/etc/ld.so.conf文件来指定动态库的目录。通常这样做就可以解决库无法链接的问题了


附加的常识:

 编译时,标准的头文件在 /usr/include 下,系统编译时默认自动到这搜索。

 若要自定义的头文件,用户可通过在命令中加I(include的第一个字母) <库路径到额外指定的头文件搜索自己要包含的头文件。

 而系统默认的链接库搜索路径在 /usr/lib , /lib 下,若要链接自己制定的库要在命令中加上 -l<库名>  -L <库的路径>

 其中:–l 指定要链接的具体库名(lib的第一个字母)

            -L 到额外库搜索的路径

 例:g++ hello.cpp –o hello –I /usr/lib/qt-3.1/include –lqt –L /usr/lib/qt-3.1/lib

解释-lqt 代表链接 qt 库,其中qt 库在/usr/lib/qt-3.1/lib下的名是libqt.so

–L /usr/lib/qt-3.1/lib 代表路径在/usr/lib/qt-3.1/lib 


参考文献:

外文的linux下配置opencv的







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值