zoukankan      html  css  js  c++  java
  • OpenCV和PCL的多版本管理

    背景

    使用cmake编译C++工程,工程依赖指定版本的opencv和pcl。因此需要在CMakeLists.txt中切换不同版本的依赖库。

     

    电脑配置

    ubuntu16.04, ros-kinetic,opencv2和opencv3,pcl1.7(ros携带)和pcl1.9(源码编译)。

     

    1. 使用find_package(Opencv REQUIRED) 寻找指定的库

    find_package() 指令优先找到opencv3。如果要用opencv2,有两个方法可以实现:

    a. 墙裂推荐此法

    设置库的路径同时显式指定版本(假定指定版本的opencv安装在 /usr/local 目录中)。

    set(OpenCV_DIR /usr/local/opencv2/share/OpenCV)
    FIND_PACKAGE( OpenCV 2.4.9 REQUIRED )

    关于pcl。如果需要使用ros携带的pcl库,在CMakeLists.txt中添加如下命令行,

    set(PCL_DIR "/usr/lib/x86_64-linux-gnu/cmake/pcl")   #该路径中存放*.cmake文件
    find_package(PCL 1.7 REQUIRED)

     b. 编译程序之前,在terminal中输入以下指令(假定多个版本的opencv都安装在 /usr/local 目录中)。

    export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/opencv2/lib/pkgconfig  
    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/opencv2/lib  

    输入以下指令让动态链接库为系统所共享,可理解为使系统读取我们设置的环境变量。

    sudo ldconfig 

    Note : 采用第二种方法有个重要前提,就是多个版本的opencv都必须安装在 /usr/local 中,这时候编译器直接在该目录下搜索目标链接。但是,由于我安装了ros-kinetic,其自带ros-kinetic-opencv3.3,该库的安装路径在编译器搜索链接的过程中具有较高的优先级,因此,编译器优先链接到该库。如下图所示,通过echo环境变量,可以看到多个版本的opencv具有不同的优先级。

    如何修改这个优先级呢?

    可以通过修改环境变量PKG_CONFIG_PATH和LD_LIBRARY_PATH来改变这个优先级。 

     

    2. find_package(Opencv REQUIRED) 如何寻找库

    理解find_package()的原理,必须先了解一个工具 -- pkg-config .

    该部分内容参考了https://blog.csdn.net/bryce_xiao/article/details/70787810

    pkg-config可用于列举出某个库的相关信息,比如此库的路径、相关头文件路径等,这在程序编译时将非常有用。例如,现在要编译一个依赖librtmp.so库的程序。去哪找librtmp.so相关的头文件呢?librtmp.so库又在哪呢?这是一个大问题,但有了pkg-config后这些都不是问题。先使用以下命令看看:

    xjh@debian:~$ pkg-config --cflags librtmp
    -I/usr/local/include
    
    xjh@debian:~$ pkg-config --libs librtmp
    -L/usr/local/lib -lrtmp -lz -lssl -lcrypto

    看到没,pkg-config能找出头文件的路径,也能找出库存放在哪,而且还能知道依赖的其它库。

    有了pkg-config后,当我编译程序要使用librtmp.so库时,就可以这么写:

    xjh@debian:~$ gcc sample.c -o sample `pkg-config --cflags --libs librtmp`

    哈哈哈哈,有了pkg-config,妈妈再也不用担心我程序编译时找不到库了。

    那么,问题也来了,pkg-config又是如何知道库存放路径及头文件路径等信息的呢?

    答案就在.pc文件中。库文件编译完成后,会在{installed_home/lib/}下生成产生一个名为pkgconfig的目录,内含该链接库的.pc文件,此文件记录了改库的相关信息。为了能被查找读取到,需要将该.pc文件安装到 /usr/lib/pkgconfig/ 目录中,或在PKG_CONFIG_PATH环境变量中加入该.pc文件的安装路径。这样做的目的是为了使依赖此库的其它程序能够借助pkg-config自动链接该库,避免编译期错误。

    pkg-config常用参数:

    –-list-all     列出所有已安装的共享库
    -–cflags     列出指定共享库的预处理和编译flag。
    -–libs     列出指定共享库的链接flag。

    环境变量 PKG_CONFIG_PATH 用于指定pkg-config查找.pc文件的路径。此外,pkg-config还会查找/usr/lib/pkgconfig/下的.pc文件。也即是说,find_package()是通过pkg-config来查找指定的库

  • 相关阅读:
    【豆科基因组】普通豆/菜豆/四季豆Common bean (Phaseolus vulgaris L.) 基因组
    【豆科基因组】利马豆/洋扁豆Lima bean(Phaseolus lunatus L.)基因组2021NC
    工作流大大批量报错
    django中request参数
    java笔记(二)----详解装箱与拆箱
    java笔记(一)----基础知识
    Navicat 快捷键
    ant+Jacoco 统计tomcat远程部署后项目接口自动化测试或者功能测试代码覆盖率
    安全测试:BurpSuite 学习使用教程(转)
    耗电量测试(转)
  • 原文地址:https://www.cnblogs.com/gdut-gordon/p/9164541.html
Copyright © 2011-2022 走看看