cmake學(xué)習(xí)筆記6-catkin的CmakeList.txt講解

引用
cmake學(xué)習(xí)筆記-cmakelist.txt創(chuàng)建項(xiàng)目示例
cmake的介紹和使用 Cmake實(shí)踐
推薦cmake手冊(cè)詳解
嚴(yán)重推薦CMake構(gòu)建系統(tǒng)的骨架
catkin_make做了什么

基礎(chǔ)變量

  • 例如:

我在/home/yuhs/novatel_ws建立了一個(gè)novatel的工作空間

在我的電腦上有如下目錄地址:
/home/yuhs/novatel_ws/devel/lib
/home/yuhs/novatel_ws/devel/lib/novatel
/home/yuhs/novatel_ws/devel/lib/novatel/novatel_node

/home/yuhs/novatel_ws/src/novatel/include/novatel
/usr/local/include/novatel

打印這些catkin系統(tǒng)變量信息如下:
CATKIN_PACKAGE_LIB_DESTINATION:lib
CATKIN_PACKAGE_BIN_DESTINATION:lib/novatel
CATKIN_PACKAGE_INCLUDE_DESTINATION:include/novatel

基礎(chǔ)知識(shí)

  • CMakeList.txt 文件中,命令名字是不區(qū)分大小寫(xiě)的,而參數(shù)和變量是大小寫(xiě)相關(guān)的

  • ros的包 catkin_make后不恭,可執(zhí)行文件在./devel/lib/proj_name/proj_name_node

catkin_package()

  • 參數(shù)解析
    Extracted CMake API reference文檔中搜索catkin_package()可以查看官方的說(shuō)明doc栅炒,加深對(duì)以下參數(shù)的理解
    1娘赴、INCLUDE_DIRS:
    2牲芋、LIBRARIES:lib_name,這個(gè)lib_name的庫(kù)會(huì)出現(xiàn)在這個(gè)catkin的catkin_LIBRARIES宏變量中剑梳,同時(shí)也會(huì)出現(xiàn)在${PROJECT_NAME}_LIBRARIES宏變量中呜达,別的工程是可以通過(guò)find_package找到這個(gè)lib_name庫(kù)的谣蠢,
    3、CATKIN_DEPENDS:proj_name查近,此list中的內(nèi)容眉踱,本質(zhì)是catkin的項(xiàng)目,同時(shí)也是被此項(xiàng)目(這個(gè)cmakelist所在的這個(gè)工程項(xiàng)目)所依賴(lài)的catkin工程項(xiàng)目霜威,此項(xiàng)目會(huì)通過(guò)find_package()或pkg-config來(lái)調(diào)用這些list中的內(nèi)容勋锤;
    4、DEPENDS:proj_name侥祭,此list中的內(nèi)容叁执,本質(zhì)是cmake的項(xiàng)目,同時(shí)也是被此項(xiàng)目(這個(gè)cmakelist所在的這個(gè)工程項(xiàng)目)所依賴(lài)的cmake工程項(xiàng)目矮冬,此項(xiàng)目會(huì)通過(guò)find_package()或pkg-config來(lái)調(diào)用這些list中的內(nèi)容谈宛;
    5、CFG_EXTRAS:外部配置文件
    6胎署、EXPORTED_TARGETS
    7吆录、SKIP_CMAKE_CONFIG_GENERATION
    8、SKIP_PKG_CONFIG_GENERATION
catkin_package(
      INCLUDE_DIRS include
      LIBRARIES novatel
      CATKIN_DEPENDS serial roslib roscpp rosconsole tf gps_msgs nav_msgs sensor_msgs
      DEPENDS Boost
    )

FIND_PACKAGE

  • FIND_PACKAGE 功能解釋?zhuān)?br> 會(huì)在全局琼牧,全盤(pán)尋找指定name的庫(kù)恢筝,然后找到了后哀卫,就會(huì)將name_xxxx等變量賦值,就可以用對(duì)應(yīng)的變量了撬槽,舉例說(shuō)明吧
    比如下面這些變量此改,就會(huì)被賦值
<NAME>_FOUND 
<NAME>_INCLUDE_DIRS or <NAME>_INCLUDES
<NAME>_LIBRARIES or <NAME>_LIBS
<NAME>_DEFINITIONS
  • 命令用法:
    find_package(<package> [version] [EXACT] [QUIET]
    [[REQUIRED|COMPONENTS] [components...]]
    [NO_POLICY_SCOPE])

  • 例如:
    find_package(Boost 1.49.0 COMPONENTS unit_test_framework serialization)
    Boost就是package,COMPONENTS 后面跟著的就是列出的一些與包相關(guān)的部件清單,這句話(huà)我也沒(méi)太理解侄柔,以后再補(bǔ)充共啃,

當(dāng)找到package后,Boost_INCLUDE_DIR這個(gè)變量就是被賦值了的暂题,這都是自動(dòng)化完成的

  • REQUIRED 參數(shù)
    其含義是指是否是工程必須的移剪,表示如果報(bào)沒(méi)有找到的話(huà),cmake的過(guò)程會(huì)終止薪者,并輸出警告信息纵苛。對(duì)應(yīng)于

  • COMPONENTS
    如何理解這個(gè)參數(shù)


    COMPONENTS參數(shù)的含義
  • version參數(shù)
    需要一個(gè)版本號(hào),它是正在查找的包應(yīng)該兼容的版本號(hào)(格式是major[.minor[.patch[.tweak]]])言津。

  • EXACT選項(xiàng)
    要求版本號(hào)必須精確匹配攻人。如果在find-module內(nèi)部對(duì)該命令的遞歸調(diào)用沒(méi)有給定[version]參數(shù),那么[version]和EXACT選項(xiàng)會(huì)自動(dòng)地從外部調(diào)用前向繼承纺念。對(duì)版本的支持目前只存在于包和包之間(詳見(jiàn)下文)。

QUIET 參數(shù):
會(huì)禁掉包沒(méi)有被發(fā)現(xiàn)時(shí)的警告信息想括。對(duì)應(yīng)于Find<name>.cmake模塊中的 NAME_FIND_QUIETLY陷谱。

  • 和catkin相關(guān)的查找包
    如下所示:
find_package(catkin COMPONENTS serial roslib roscpp rosconsole tf gps_msgs nav_msgs sensor_msgs)

加入了catkin的關(guān)鍵字,每個(gè)ros的包都至少有一個(gè)find_package需要依賴(lài)catkin這個(gè)包
上面命令解釋?zhuān)翰檎襝atkin包瑟蜈,并且這個(gè)catkin包依賴(lài)組件:serial roslib roscpp rosconsole tf gps_msgs nav_msgs sensor_msgs

project()

如果子文件夾Cmakelists.txt當(dāng)中沒(méi)有project(name_xxx1)烟逊,那么使用PROJECT_NAME就會(huì)繼承父文件夾當(dāng)中的project(name_xxx)定的 name_xxx1,如果子目錄當(dāng)中的Cmakelists.txt當(dāng)中定義過(guò)project(name_xxx2)铺根,那么子目錄當(dāng)中的Cmakelists.txt當(dāng)中的 PROJECT_NAME就會(huì)是子Cmakelists.txt定義的這個(gè)name_xxx

add_subdirectory()

add_subdirectory 會(huì)去這個(gè)指定的目錄尋找子cmakelists.txt
在交叉目錄 需要尋找頭文件的時(shí)候宪躯,調(diào)用者的目錄當(dāng)中的CMakeLists.txt當(dāng)中添加頭文件路徑

include_directories()

  • 增加單個(gè)目錄
    include_directories(include)
  • 增加多個(gè)目錄
    include_directories(include ${catkin_INCLUDE_DIRS} ${Boost_INCLUDE_DIRS})

庫(kù)相關(guān)的指令

引用:跟庫(kù)相關(guān)的幾個(gè)命令講解的帖子
http://blog.csdn.net/arackethis/article/details/43488177
http://blog.csdn.net/michaelhan3/article/details/69568362

1、ADD_LIBRARY

ADD_LIBRARY 告訴工程位迂,生成一個(gè)庫(kù)访雪,并將源碼鏈接到具體名字的庫(kù)當(dāng)中
例如:
add_library(lib_name ${SRC_LISTS}) #將集合里的所有的源文件生成一個(gè)靜態(tài)庫(kù),該靜態(tài)庫(kù)的名字lib_name掂林,注意臣缀,在整個(gè)CmakeLists里都要用lib_name這個(gè)

  • BUILD_SHARED_LIBS
    這個(gè)參數(shù)屬于catkin系統(tǒng)的參數(shù),如果是on泻帮,則add_library構(gòu)建的則是SHARED類(lèi)型的庫(kù)精置,就是動(dòng)態(tài)庫(kù),如果是off锣杂,那么就是static的庫(kù)
  • 位置
    這個(gè)命令構(gòu)建完畢的動(dòng)態(tài)庫(kù)所在位置如下所示():
    /home/yuhs/novatel_ws/devel/lib/libnovatel.so

2脂倦、TARGET_LINK_LIBRARIES

  • TARGET_LINK_LIBRARIES

語(yǔ)法:TARGET_LINK_LIBRARIES(targetlibrary1 <debug | optimized> library2 ..)

比如(以下寫(xiě)法(包括備注中的)都可以):
TARGET_LINK_LIBRARIES(myProject hello)番宁,連接libhello.so庫(kù)到myProject(可執(zhí)行文件)當(dāng)中
TARGET_LINK_LIBRARIES(myProject libhello.a)
TARGET_LINK_LIBRARIES(myProject libhello.so)

再如:
TARGET_LINK_LIBRARIES(myProject libeng.so)  #將libeng.so鏈接到myProject中。
TARGET_LINK_LIBRARIES(myProject eng)
TARGET_LINK_LIBRARIES(myProject -leng)

target_link_libraries(lib_name #鏈接靜態(tài)庫(kù)需要的依賴(lài)庫(kù)
${OpenCV_LIBS}
${PROJECT_SOURCE_DIR}/lib/libCommonUtilities.so
${PROJECT_SOURCE_DIR}/lib/libInuStreams.so
)
從這個(gè)例子當(dāng)中可以看出target_link_libraries功能赖阻,如果第一個(gè)是靜態(tài)庫(kù)(因?yàn)闆](méi)有用shared相關(guān)的關(guān)鍵詞蝶押,所以為靜態(tài)),那么就是把其他庫(kù)也連接到這個(gè)靜態(tài)庫(kù)當(dāng)中政供,第一個(gè)參數(shù)也可以是執(zhí)行文件播聪,然后將庫(kù)鏈接到可執(zhí)行的應(yīng)用文件中,如下例子所示

3布隔、LINK_DIRECTORIES(添加需要鏈接的庫(kù)文件目錄离陶,這個(gè)是增加目錄)

語(yǔ)法:
link_directories(directory1 directory2 ...)
它相當(dāng)于g++命令的-L選項(xiàng)的作用,也相當(dāng)于環(huán)境變量中增加LD_LIBRARY_PATH的路徑的作用衅檀。
比如:
LINK_DIRECTORIES("/opt/MATLAB/R2012a/bin/glnxa64")
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$MATLAB/bin/glnxa64

4招刨、LINK_LIBRARIE(添加需要鏈接的庫(kù)文件的全路徑,這個(gè)是增加具體的庫(kù)文件)

List of direct link dependencies.
比如:
LINK_LIBRARIES("/opt/MATLAB/R2012a/bin/glnxa64/libeng.so")
LINK_LIBRARIES("/opt/MATLAB/R2012a/bin/glnxa64/libmx.so")
也可以寫(xiě)成:
LINK_LIBRARIES("/opt/MATLAB/R2012a/bin/glnxa64/libeng.so" "/opt/MATLAB/R2012a/bin/glnxa64/libmx.so")

不同命令之間的關(guān)系講解

1哀军、生成可執(zhí)行文件和鏈接庫(kù)之間

先生成可執(zhí)行文件沉眶,后把庫(kù)連接到可執(zhí)行文件中即可
add_executable(hello ${APP_SRC})
target_link_libraries(hello libhello)

鏈接工程的各種方法

1、把子模塊的src源碼 先鏈接為庫(kù)杉适,在把庫(kù)連接到main可執(zhí)行文件中

  • 理解

  • 例子說(shuō)明谎倔,如下所示:

project(HELLO)
set(LIB_SRC hello.c)
set(APP_SRC main.c)
add_library(libhello ${LIB_SRC})
add_executable(hello ${APP_SRC})
target_link_libraries(hello libhello)

里面有一點(diǎn)不爽,對(duì)不猿推?
因?yàn)槲业目蓤?zhí)行程序(add_executable)占據(jù)了 hello 這個(gè)名字片习,所以 add_library 就不能使用這個(gè)名字了
然后,我們?nèi)チ藗€(gè)libhello 的名字,這將導(dǎo)致生成的庫(kù)為 libhello.lib(或 liblibhello.a),很不爽
想生成 hello.lib(或libhello.a) 怎么辦?
添加一行
set_target_properties(libhello PROPERTIES OUTPUT_NAME "hello")
就可以了

2缩赛、源碼添加到APP_SRC這種變量中,然后利用add_executable統(tǒng)一鏈接到main的可執(zhí)行文件中

  • 理解
  • 例子說(shuō)明

list

  • list(APPEND <list> [<element> ...])
    將element內(nèi)容追加到list當(dāng)中

install

cmake:install學(xué)習(xí)

  • 1孽查、install(TARGETS detect_cl img_tool test_detect
    RUNTIME DESTINATION bin
    LIBRARY DESTINATION lib
    ARCHIVE DESTINATION lib/static)
    【命令解析】:
    將生成的target安裝到指定目錄下,這里 detect_cl,img_tool是動(dòng)態(tài)庫(kù),test_detect是可執(zhí)行程序,
    cmake會(huì)自動(dòng)根據(jù)target的類(lèi)型將可執(zhí)行程序(如.exe)和動(dòng)態(tài)庫(kù)(如.dll)作為RUNTIME類(lèi)型復(fù)制到bin下,
    將動(dòng)態(tài)庫(kù)的導(dǎo)入庫(kù)(.lib .a)作為ARCHIVE類(lèi)型復(fù)制lib/static目錄下
  • install(DIRECTORY include/${PROJECT_NAME}/
    DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION}
    FILES_MATCHING PATTERN ".h" PATTERN ".svn" EXCLUDE )
    【命令解析】:
    1坦喘、DESTINATION 會(huì)被${CATKIN_PACKAGE_INCLUDE_DESTINATION}替代
    2盲再、include/${PROJECT_NAME}/
    DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION} = include/novatel/include/novatel
    具體可以參照文章開(kāi)頭的描述信息,我的工作空間是以novatel作為例子分析
    3瓣铣、FILES_MATCHING PATTERN "
    .h"意思:匹配所有.h的文件
    4洲胖、PATTERN ".svn" EXCLUDE意思:后面加了exclude,表明排除.svn的匹配
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末坯沪,一起剝皮案震驚了整個(gè)濱河市绿映,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖叉弦,帶你破解...
    沈念sama閱讀 222,252評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件丐一,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡淹冰,警方通過(guò)查閱死者的電腦和手機(jī)库车,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)樱拴,“玉大人柠衍,你說(shuō)我怎么就攤上這事【牵” “怎么了珍坊?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,814評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)正罢。 經(jīng)常有香客問(wèn)我阵漏,道長(zhǎng),這世上最難降的妖魔是什么翻具? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,869評(píng)論 1 299
  • 正文 為了忘掉前任履怯,我火速辦了婚禮,結(jié)果婚禮上裆泳,老公的妹妹穿的比我還像新娘叹洲。我一直安慰自己,他們只是感情好工禾,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布运提。 她就那樣靜靜地躺著,像睡著了一般帜篇。 火紅的嫁衣襯著肌膚如雪糙捺。 梳的紋絲不亂的頭發(fā)上诫咱,一...
    開(kāi)封第一講書(shū)人閱讀 52,475評(píng)論 1 312
  • 那天笙隙,我揣著相機(jī)與錄音,去河邊找鬼坎缭。 笑死竟痰,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的掏呼。 我是一名探鬼主播坏快,決...
    沈念sama閱讀 41,010評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼憎夷!你這毒婦竟也來(lái)了莽鸿?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,924評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎祥得,沒(méi)想到半個(gè)月后兔沃,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,469評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡级及,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評(píng)論 3 342
  • 正文 我和宋清朗相戀三年乒疏,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片饮焦。...
    茶點(diǎn)故事閱讀 40,680評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡怕吴,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出县踢,到底是詐尸還是另有隱情转绷,我是刑警寧澤,帶...
    沈念sama閱讀 36,362評(píng)論 5 351
  • 正文 年R本政府宣布殿雪,位于F島的核電站暇咆,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏丙曙。R本人自食惡果不足惜爸业,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望亏镰。 院中可真熱鬧扯旷,春花似錦、人聲如沸索抓。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,519評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)逼肯。三九已至耸黑,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間篮幢,已是汗流浹背大刊。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,621評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留三椿,地道東北人缺菌。 一個(gè)月前我還...
    沈念sama閱讀 49,099評(píng)論 3 378
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像搜锰,于是被迫代替她去往敵國(guó)和親伴郁。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容

  • CMake學(xué)習(xí) 本篇分享一下有關(guān)CMake的一些學(xué)習(xí)心得以及相關(guān)使用蛋叼。 本文目錄如下: [1焊傅、CMake介紹] [...
    AlphaGL閱讀 12,252評(píng)論 11 79
  • 向您的項(xiàng)目添加 C 和 C++ 代碼 本文內(nèi)容 下載 NDK 和構(gòu)建工具 創(chuàng)建支持 C/C++ 的新項(xiàng)目 構(gòu)建和運(yùn)...
    會(huì)飛的大象_閱讀 3,797評(píng)論 0 3
  • 注:首發(fā)地址 1. 前言 當(dāng)在做 Android NDK 開(kāi)發(fā)時(shí)剂陡,如果不熟悉用 CMake 來(lái)構(gòu)建,讀不懂 CMa...
    cfanr閱讀 24,430評(píng)論 1 53
  • 序 本文主要來(lái)聊聊分布式id的生成方案狐胎。 目標(biāo) 業(yè)務(wù)系統(tǒng)需要什么樣的ID生成器中提出了幾點(diǎn)目標(biāo): 唯一性 時(shí)間相關(guān)...
    go4it閱讀 632評(píng)論 0 3
  • 夏晨扶貧到深灣鹏倘, 綠樹(shù)繞居遮茅檐。 主人倚門(mén)獨(dú)憔悴顽爹, 扶者嘻嘻煙薰天纤泵。 一炷燃罷方提筆, 兩紙寫(xiě)就才算完镜粤。 莫怪我...
    寺咀山主人閱讀 238評(píng)論 0 0