CMake之find_package

首先強烈推薦對CMake不熟的同學(xué)先看這本書《Cmake實踐》(提取碼:qgca)狰右。

CMake說起來是個好東西,可是真正用的時候并不那么容易舆床,很容易出現(xiàn)各種各樣的錯誤棋蚌。這不,最近就被find_package這個命令折騰得死去活來挨队。只好花了一天半時間附鸽,看上面那本書,再查資料瞒瘸,總算解決了昨天遇到的問題坷备。

問題描述

已經(jīng)成功編譯了深度學(xué)習(xí)框架Caffe,例程也可以順利執(zhí)行情臭。

但是當(dāng)我在自己的代碼中調(diào)用編譯好的Caffe庫時省撑,卻出現(xiàn)了編譯錯誤。此前俯在,我已經(jīng)在CMakeLists.txt中添加了下面幾句話:

include_directories(/home/wjg/projects/caffe/build/install/include)
add_executable(useSSD ssd_detect.cpp)
target_link_libraries(useSSD /home/wjg/projects/caffe/build/install/lib/libcaffe.so)

執(zhí)行make后竟秫,鏈接出錯,找不到libboost_system.so文件跷乐。

這一錯誤倒是給我提了個醒肥败,我本以為自己的代碼中沒用到boost,就不必添加boost庫路徑了,誰知道libcaffe.so中用到的庫也需要手動添加進去馒稍。

這時候我才意識到動態(tài)鏈接庫和靜態(tài)鏈接庫的區(qū)別皿哨。前者在程序運行時動態(tài)加載,而后者是在編譯時就和程序結(jié)合到一起了纽谒。于是動態(tài)鏈接庫即使編譯完成证膨,也和其它動態(tài)庫是分離的,因此每次用都要把所有涉及的動態(tài)庫全部添加進來鼓黔。在我的例子中央勒,不僅僅需要添加boost,還有atlas澳化、protobuf等等一大堆動態(tài)鏈接庫需要添加崔步。這個時候,一條條添加就顯得太過麻煩缎谷,可以借助find_package命令一次性添加所有與Caffe相關(guān)的動態(tài)鏈接庫井濒。

find_package用法

使用如下方式查找Caffe庫:

find_package(Caffe REQUIRED)

如果找到Caffe庫,就可以在接下來的語句中使用Caffe_INCLUDE_DIRSCaffe_LIBRARIES這兩個變量慎陵,比如

find_package(Caffe REQUIRED)

if (NOT Caffe_FOUND)
    message(FATAL_ERROR "Caffe Not Found!")
endif (NOT Caffe_FOUND)

include_directories(${Caffe_INCLUDE_DIRS})

add_executable(useSSD ssd_detect.cpp)
target_link_libraries(useSSD ${Caffe_LIBRARIES})

問題是眼虱,很多情況下都會找不著喻奥,或者找到了錯誤的位置席纽。要想用對find_package,就需要了解它的工作原理撞蚕。

find_package原理

首先明確一點润梯,cmake本身不提供任何搜索庫的便捷方法,所有搜索庫并給變量賦值的操作必須由cmake代碼完成甥厦,比如下面將要提到的FindXXX.cmake和XXXConfig.cmake纺铭。只不過,庫的作者通常會提供這兩個文件刀疙,以方便使用者調(diào)用舶赔。

find_package采用兩種模式搜索庫:

  • Module模式:搜索CMAKE_MODULE_PATH指定路徑下的FindXXX.cmake文件,執(zhí)行該文件從而找到XXX庫谦秧。其中竟纳,具體查找?guī)觳⒔oXXX_INCLUDE_DIRSXXX_LIBRARIES兩個變量賦值的操作由FindXXX.cmake模塊完成。
  • Config模式:搜索XXX_DIR指定路徑下的XXXConfig.cmake文件疚鲤,執(zhí)行該文件從而找到XXX庫锥累。其中具體查找?guī)觳⒔oXXX_INCLUDE_DIRSXXX_LIBRARIES兩個變量賦值的操作由XXXConfig.cmake模塊完成。

兩種模式看起來似乎差不多集歇,不過cmake默認(rèn)采取Module模式桶略,如果Module模式未找到庫,才會采取Config模式。如果XXX_DIR路徑下找不到XXXConfig.cmake文件际歼,則會找/usr/local/lib/cmake/XXX/中的XXXConfig.cmake文件惶翻。總之蹬挺,Config模式是一個備選策略维贺。通常,庫安裝時會拷貝一份XXXConfig.cmake到系統(tǒng)目錄中巴帮,因此在沒有顯式指定搜索路徑時也可以順利找到溯泣。

在我遇到的問題中,由于Caffe安裝時沒有安裝到系統(tǒng)目錄榕茧,因此無法自動找到CaffeConfig.cmake垃沦,我在CMakeLists.txt最前面添加了一句話之后就可以了。

set(Caffe_DIR /home/wjg/projects/caffe/build)   #添加CaffeConfig.cmake的搜索路徑

find_package(Caffe REQUIRED)

if (NOT Caffe_FOUND)
    message(FATAL_ERROR "Caffe Not Found!")
endif (NOT Caffe_FOUND)

include_directories(${Caffe_INCLUDE_DIRS})

add_executable(useSSD ssd_detect.cpp)
target_link_libraries(useSSD ${Caffe_LIBRARIES})

其實關(guān)于find_package還有許多知識點用押,可惜我也沒能全部掌握肢簿。XXXConfig.cmake的默認(rèn)搜索路徑也不止一個,它們有詳細(xì)的優(yōu)先級順序蜻拨。對于庫的開發(fā)者來說池充,如何生成FindXXX.cmake或XXXConfig.cmake文件更是一個復(fù)雜工程,需要了解更多的知識缎讼,希望以后有機會再深入了解收夸。

參考資料

CMake 2.8.10 Documentation

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市血崭,隨后出現(xiàn)的幾起案子卧惜,更是在濱河造成了極大的恐慌,老刑警劉巖夹纫,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件咽瓷,死亡現(xiàn)場離奇詭異,居然都是意外死亡舰讹,警方通過查閱死者的電腦和手機茅姜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來月匣,“玉大人钻洒,你說我怎么就攤上這事⊥按恚” “怎么了航唆?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長院刁。 經(jīng)常有香客問我糯钙,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任任岸,我火速辦了婚禮再榄,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘享潜。我一直安慰自己困鸥,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布剑按。 她就那樣靜靜地躺著疾就,像睡著了一般。 火紅的嫁衣襯著肌膚如雪艺蝴。 梳的紋絲不亂的頭發(fā)上猬腰,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天,我揣著相機與錄音猜敢,去河邊找鬼姑荷。 笑死,一個胖子當(dāng)著我的面吹牛缩擂,可吹牛的內(nèi)容都是我干的鼠冕。 我是一名探鬼主播,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼胯盯,長吁一口氣:“原來是場噩夢啊……” “哼懈费!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起陨闹,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤楞捂,失蹤者是張志新(化名)和其女友劉穎薄坏,沒想到半個月后趋厉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡胶坠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年君账,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片沈善。...
    茶點故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡乡数,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出闻牡,到底是詐尸還是另有隱情净赴,我是刑警寧澤,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布罩润,位于F島的核電站玖翅,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜金度,卻給世界環(huán)境...
    茶點故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一应媚、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧猜极,春花似錦中姜、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至受扳,卻和暖如春嗜桌,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背辞色。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工骨宠, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人相满。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓层亿,卻偏偏與公主長得像,于是被迫代替她去往敵國和親立美。 傳聞我的和親對象是個殘疾皇子匿又,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,033評論 2 355

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

  • 摘要:本系列文章主要講解caffe的整個使用流程,適合初級入門caffe建蹄,通過學(xué)習(xí)本篇文章碌更,理清項目訓(xùn)練、測試流程...
    踩坑第某人閱讀 8,387評論 0 4
  • Question1 :How find_package() works ? 首先明確一點洞慎,cmake本身不提供任何...
    江州司馬binbin閱讀 5,962評論 0 3
  • CMake學(xué)習(xí) 本篇分享一下有關(guān)CMake的一些學(xué)習(xí)心得以及相關(guān)使用痛单。 本文目錄如下: [1、CMake介紹] [...
    AlphaGL閱讀 12,247評論 11 79
  • 看了一些漫畫和紀(jì)錄片,對 設(shè)計 反而有更多的理解了焦人。 立意的出發(fā)點挥吵,真的是很重要很重要的。然后花椭,只需要自然流露和節(jié)...
    Cisa閱讀 182評論 0 3
  • 等著電梯自己關(guān)門 從容與急切 修行與不修行 清涼與煩惱 天堂與地獄 其實常常只有 一秒不到的時間 緩一秒 海闊天空...
    扎高拉姆閱讀 186評論 0 0