1. 程式人生 > >CMakeLists.txt中常用庫檔案的查詢和連結

CMakeLists.txt中常用庫檔案的查詢和連結

         在使用CMake組織工程時,如果我們需要依賴某個庫檔案,需要完成以下步驟:

  1. 查詢庫檔案(find_package命令)
  2. 判斷是否找到庫檔案(XXX_FOUND標記),幷包含標頭檔案(include_directories命令)
  3. 連結庫檔案到目標(target_link_libraries命令)

         因此,庫檔案、標頭檔案的名字(大小寫)我們就要清楚的寫明,不要混淆。我常用的庫如OpenCV, catkin, Boost, Eigen等,其用法如下。常見的名字有:name_INCLUDE_DIRS, name_INCLUDE_DIR, NAME_INCLUDE_DIRS, NAME_INCLUDE_DIR; name_LIBS, NAME_LIBS, name_LIBRARIES, NAME_LIBRARIES等。

         其中,Eigen比較特殊, Eigen採用原始碼的方式提供給使用者使用,在使用時只需要包含Eigen的標頭檔案即可進行使用。之所以採用這種方式,是因為Eigen採用模板方式實現,由於模板函式不支援分離編譯,所以只能提供原始碼而不是動態庫的方式供使用者使用。

#查詢OpenCV是否安裝
find_package(OpenCV REQUIRED core highgui imgproc imgcodecs)
if (OPENCV_FOUND)
    message(STATUS "找到OpenCV:\"${OpenCV_INCLUDE_DIRS}\",ENABLE_OPENCV巨集已開啟")
    message(STATUS "找到OpenCV:\"${OpenCV_LIBS}\"")
    include_directories(${OpenCV_INCLUDE_DIRS})
    add_definitions(-DENABLE_OPENCV)
    list(APPEND LINK_LIB_LIST ${OpenCV_LIBS})
endif (OPENCV_FOUND)

#查詢Boost是否安裝
find_package(Boost REQUIRED COMPONENTS
        regex
        graph
        chrono
        thread
        system
        filesystem
        serialization)
if (Boost_FOUND)
    message(STATUS "找到Boost:\"${Boost_INCLUDE_DIRS}\",ENABLE_BOOST巨集已開啟")
    message(STATUS "找到Boost:\"${Boost_LIBRARIES}\"")
    include_directories(${Boost_INCLUDE_DIRS})
    add_definitions(-DENABLE_BOOST)
    list(APPEND LINK_LIB_LIST ${Boost_LIBRARIES})
endif (Boost_FOUND)

#查詢catkin是否安裝
find_package(catkin REQUIRED COMPONENTS
        geometry_msgs
        roscpp
        tf
        )
if (catkin_FOUND)
    message(STATUS "找到catkin:\"${catkin_INCLUDE_DIRS}\",ENABLE_CATKIN巨集已開啟")
    message(STATUS "找到catkin:\"${catkin_LIBRARIES}\"")
    include_directories(${catkin_INCLUDE_DIRS})
    add_definitions(-DENABLE_CATKIN)
    list(APPEND LINK_LIB_LIST ${catkin_LIBRARIES})
endif (catkin_FOUND)

#查詢Eigen3是否安裝
find_package(Eigen3 REQUIRED)
if (EIGEN3_FOUND)
    message(STATUS "找到Eigen3:\"${EIGEN3_INCLUDE_DIR}\",ENABLE_EIGEN3巨集已開啟")
    include_directories(${EIGEN3_INCLUDE_DIR})
    add_definitions(-DENABLE_EIGEN3)
#    Eigen採用原始碼的方式提供給使用者使用,在使用時只需要包含Eigen的標頭檔案即可進行使用。
#    之所以採用這種方式,是因為Eigen採用模板方式實現,由於模板函式不支援分離編譯,所以只能提供原始碼而不是動態庫的方式供使用者使用。
#    list(APPEND LINK_LIB_LIST ${EIGEN3_LIBRARIES})
endif (EIGEN3_FOUND)

#MESSAGE(STATUS "**--** LINK_LIB_LIST: ${LINK_LIB_LIST}")

target_link_libraries(${CMAKE_PROJECT_NAME}_shared ${LINK_LIB_LIST})

         執行Reload CMake Project後的輸出資訊如下(不同的機器不同的安裝路徑輸出會不一樣):

-- 找到OpenCV:"/opt/ros/kinetic/include/opencv-3.3.1;/opt/ros/kinetic/include/opencv-3.3.1/opencv",ENABLE_OPENCV巨集已開啟
-- 找到OpenCV:"opencv_core;opencv_highgui;opencv_imgproc;opencv_imgcodecs"
-- Boost version: 1.58.0
-- Found the following Boost libraries:
--   regex
--   graph
--   chrono
--   thread
--   system
--   filesystem
--   serialization
--   date_time
--   atomic
-- 找到Boost:"/usr/include",ENABLE_BOOST巨集已開啟
-- 找到Boost:"/usr/lib/x86_64-linux-gnu/libboost_regex.so;/usr/lib/x86_64-linux-gnu/libboost_graph.so;/usr/lib/x86_64-linux-gnu/libboost_chrono.so;/usr/lib/x86_64-linux-gnu/libboost_thread.so;/usr/lib/x86_64-linux-gnu/libboost_system.so;/usr/lib/x86_64-linux-gnu/libboost_filesystem.so;/usr/lib/x86_64-linux-gnu/libboost_serialization.so;/usr/lib/x86_64-linux-gnu/libboost_date_time.so;/usr/lib/x86_64-linux-gnu/libboost_atomic.so"
-- .......省略........
-- 找到catkin:"/home/gjs/catkin_ws/devel/include;/home/gjs/catkin_ws/src/geometry/tf/include;/opt/ros/kinetic/include;/opt/ros/kinetic/share/xmlrpcpp/cmake/../../../include/xmlrpcpp;/usr/include",ENABLE_CATKIN巨集已開啟
-- 找到catkin:"/opt/ros/kinetic/lib/libtf.so;/opt/ros/kinetic/lib/libtf2_ros.so;/opt/ros/kinetic/lib/libactionlib.so;/opt/ros/kinetic/lib/libmessage_filters.so;/opt/ros/kinetic/lib/libroscpp.so;/usr/lib/x86_64-linux-gnu/libboost_filesystem.so;/usr/lib/x86_64-linux-gnu/libboost_signals.so;/opt/ros/kinetic/lib/libxmlrpcpp.so;/opt/ros/kinetic/lib/libtf2.so;/opt/ros/kinetic/lib/libroscpp_serialization.so;/opt/ros/kinetic/lib/librosconsole.so;/opt/ros/kinetic/lib/librosconsole_log4cxx.so;/opt/ros/kinetic/lib/librosconsole_backend_interface.so;/usr/lib/x86_64-linux-gnu/liblog4cxx.so;/usr/lib/x86_64-linux-gnu/libboost_regex.so;/opt/ros/kinetic/lib/librostime.so;/opt/ros/kinetic/lib/libcpp_common.so;/usr/lib/x86_64-linux-gnu/libboost_system.so;/usr/lib/x86_64-linux-gnu/libboost_thread.so;/usr/lib/x86_64-linux-gnu/libboost_chrono.so;/usr/lib/x86_64-linux-gnu/libboost_date_time.so;/usr/lib/x86_64-linux-gnu/libboost_atomic.so;/usr/lib/x86_64-linux-gnu/libpthread.so;/usr/lib/x86_64-linux-gnu/libconsole_bridge.so"
-- 找到Eigen3:"/usr/include/eigen3",ENABLE_EIGEN3巨集已開啟
         對於自定義的庫,庫檔案和標頭檔案的名稱可能有所區別。

相關推薦

CMakeLists.txt常用檔案查詢連結

         在使用CMake組織工程時,如果我們需要依賴某個庫檔案,需要完成以下步驟:查詢庫檔案(find_package命令)判斷是否找到庫檔案(XXX_FOUND標記),幷包含標頭檔案(include_directories命令)連結庫檔案到目標(target_li

qt .pro檔案cmakelists.txt配置第三方

.pro檔案引用第三方庫檔案和標頭檔案路徑 1.庫檔案(LIBS新增的是共享庫檔案,-L新增目錄,-l指定共享庫名稱) LIBS += -L/usr/local/lib -lmath LIBS的使用就是-L指定庫的目錄,而-l指定庫的名字,在Linux下,則去掉lib和字尾名,windows下

VC 6 0新增檔案標頭檔案

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

qt .pro文件cmakelists.txt配置第三方

files 文件 oos cpp 配置 window set local main .pro文件引用第三方庫文件和頭文件路徑 1.庫文件(LIBS添加的是共享庫文件,-L添加目錄,-l指定共享庫名稱) LIBS += -L/usr/local/lib -lmath LI

linux動態的編譯載入的查詢順序

Glibc安裝的庫中有一個名為ld-Linux.so.X其中X為一個數字(版本), 在不同的平臺上可以通過ldd檢視 $ldd /bin/cat linux-vdso.so.1 =>  (0x00007fff9176f000) libc.so.6 => /lib

(轉)VC 6.0新增檔案標頭檔案

https://blog.csdn.net/yusiguyuan/article/details/12649665  附加標頭檔案包含 VC6.0中: VC6.0預設include包含路徑:Tools>Options>Directories>Include f

maven的安裝、路徑配置、修改檔案路徑eclipse的配置、建立maven工程。

maven的安裝、路徑配置、修改庫檔案路徑與在eclipse中的配置一、maven的安裝解壓apache-maven-3.3.9-bin.zip到自己的資料夾下,解壓後路徑如:D:\Program\apache-maven-3.3.9。二、路徑配置右鍵“計算機”,選擇“屬性”

Linux--Cmakelists.txt關於include_directories,link_directories,link_librariestarget_link_libraries解析

總結一下include_directories,link_directories,link_libraries和target_link_libraries(此處大小寫字母皆可)的作用。 1.INCLUDE_DIRECTORIES(新增標頭檔案目錄) 它相當於g++選項中的-I引數的作用,

C#語言常用的判斷語句循環語句

只讀 代碼示例 賦值 循環 數字 其他 do while 表達 集合 C#語言中,我們常用的判斷語句和循環語句都有哪些呢? 1、if判斷 代碼格式:if(條件1){  代碼1 }else if(條件2){  代碼2

MS Sql Server 主從的配置使用介紹

money mas 篩選 緩存 事務性 添加 com 對象 報表 https://technet.microsoft.com/zh-cn/ff806143.aspx 網站規模到了一定程度之後,該分的也分了,該優化的也做了優化,但是還是不能滿足業務上對性能的要求;這時候我們

python常用的文件目錄操作(二)

工作目錄 environ win works ID ksh sys remove -s OS模塊 一. 概述 python os模塊提供了非常豐富的方法用來處理文件和目錄 二. 導入:import os 三. 常用方法 1. os.name 輸出字符串表示正在使用的平臺,如

學習筆記sql server數據批量查詢刪除內容執行語句

sql server 數據庫 查詢 最近一直在研究博客,其實也就是現在熱門的自媒體,有意思的是,以前網民們都自己寫博客,建立一個自己的小站,現在又去了,都跑去平臺給人家免費打工,還自得其樂,也不知道這是什麽狀況。博客信息:主題:讀書筆記相關的學習主題。網站:使用一個.net的域名作為網址,例如駱駝

EF6基礎系列(十一)---EF6的異步查詢異步保存

chang 執行過程 fin .cn state 徹底 www. sch 查詢 EF6中的異步查詢和異步保存 在.NET4.5中介紹了異步操作,異步操作在EF中也很有用,在EF6中我們可以使用DbContext的實例進行異步查詢和異步保存。 1.異步查詢 下邊是一個通

在Excel使用SQL語句查詢篩選

本文轉自:http://blog.sina.com.cn/s/blog_5fc375650102e1g5.html 今天在微博上看到@資料分析精選 分享的一篇文章,是關於《在Excel中使用SQL語句實現精確查詢》,覺得非常受用,分享給大家。 微博上有人回覆評論說直接用vlooku

JNI/NDK:CMakeLists.txt 構建so,匯入三方so

本文使用最新的JNI構建工具CMake完成 通過這篇文章,你講學習到: camke構建自己的三方so庫 學會使用cmake管理自己jni檔案 學會使用cmake呼叫三方的so庫 1.CMakeLists.txt 構建so庫 建立jni的工具類

django常用的資料查詢方法

5.2 資料查詢 要從資料庫檢索資料,首先要獲取一個*查詢集***(QuerySet),查詢集表示從資料庫獲取的物件集合,它可以有零個,一個或多個過濾器。返回查詢集的方法,稱為過濾器,過濾器根據給定的引數縮小查詢結果範圍,相當於sql語句中where或limit。 在管理器上

k8shostname, hosts檔案, DNS代理問題, servicepod的訪問問題

驗證一個域名的ip地址可以使用 nslookup xx.xx..xx 在kubernets中不同名稱空間的服務相互訪問 涉及到的是Pod和Service之間的相互訪問,主要格式如下: 訪問Pod:(注意下面不是直接pod的ip,而是由pod的ip組成的字串)

Cmakelists.txt配置glew

在cmakelists.txt中新增: add_library(glew_static STATIC IMPORTED) set_target_properties(glew_static PROPERTIES IMPORTED_LOCATION /home/ryan/DevLibrary/g

CMakeLists.txt 設定編譯後的可執行程式優先呼叫本地庫

可執行程式查詢不到so庫 庫放在可執行程式目錄下的lib資料夾下,但是可執行程式沒有去呼叫,使用ldd指令  修改ld.so.conf也是無效 是否是CMakeLists.txt設定的問題? 有事找度娘。。。  設定可執行程式優先呼叫本地庫 SET(CMA

IAR常用的 #pragma 命令擴充套件關鍵字

pragma 命令 1、#pragma message(“ ”) 編譯器編譯到此處,在Build視窗中列印相應文字資訊。 2、#pragma error “” 編譯器編譯到此處,在Build視窗中產生錯誤並列印其文字資訊。 3、#pragma inline [=forc