cmake使用

tags: 嵌入式
categories: 開發(fā)

cmake 總結(jié)

交叉編譯

  • 設(shè)置編譯器
    CMAKE_FORCE_C_COMPILER($ENV{CROSS}gcc GNU)
  • 設(shè)置pkg-config執(zhí)行的位置
    set(PKG_CONFIG_EXECUTABLE $ENV{PKG_CONFIG})
  • 設(shè)置工程名
    project(suma_middleware)
  • 設(shè)置工程的相關(guān)變量
    set(CMAKE_SYSTEM_NAME Linux)
    set(CMAKE_SYSTEM_PROCESSOR mips)

基本功能

  • 使用系統(tǒng)變量
    增加$ENV{xxx},使用系統(tǒng)變量xxx,因為目前使用的交叉編譯的方法是使用source xxx.sh文件的方法將相關(guān)的變量增加到當(dāng)前終端的系統(tǒng)變量中昵时。所以需要大量的變量都是這種形式的扩所。
  • 設(shè)置相關(guān)代碼子目錄
    按照分層的結(jié)構(gòu),比如在下一層的src中有代碼允乐,使用如下的方式增加:
    add_subdirectory(xxx)
    以上方法需要確保xxx目錄中有CMakcLists.txt文件抗蠢。
  • 設(shè)置頭文件查找位置
    cmake文檔中使用
    include_directories(xxx)
    目前我的方法是使用:
    set(dir)
    list(APPEND dir ${dir1})
    include_directories(${dir})
    以上的方式來添加編譯的選項

  • 設(shè)置庫搜索的位置
    link_directories(xxx)
    查找xxx位置有無制定的庫薛躬。
    可以按照頭文件設(shè)置的方法進行管理,這樣便于管理

  • 設(shè)置鏈接庫的名字
    在生成對應(yīng)的可執(zhí)行程序(或者庫)后面執(zhí)行
    target_link_libraries(xxx ${libname})
    小坑:注意此處增加libname cmake會自動腦補成lib${libname}.so (或者a)的文件名僧界。

  • 使用pkg-config機制查找?guī)?/p>

    • 配置package
      find_package(PkgConfig)

    • 定義宏

      macro(detectpkgconfig lib LIBNAME)  
      
      pkg_check_modules(${LIBNAME} REQUIRED ${lib} )  
      message(STATUS 'lib is' ${lib}^^^ "${LIBNAME}_INCLUDE_DIRS is " ${${LIBNAME}_INCLUDE_DIRS})  
      message(STATUS ${lib}^^^ "${LIBNAME}_CFLAGS is " ${${LIBNAME}_CFLAGS})  
      set(${LIBNAME}_INCLUDE_DIRS)  
      
      endmacro(detectpkgconfig)  
      
    • 調(diào)用宏
      detectpkgconfig(directfb DIRECTFB)

    • 增加庫相關(guān)頭文件位置
      include_directories(${DIRECTFB_INCLUDE_DIRS})

    • 增加庫位置
      link_directories(${DIRECTFB__LIBRARY_DIRS})

  • 生成可執(zhí)行文件
    add_executable(demo main.c)

  • 生成庫文件
    add_library(xxx ${SRC_LIST}) (有變量可以定義生成的為靜態(tài)庫或者是動態(tài)庫)

  • 鏈接順序
    編寫makefile的時候就容易踩得坑∏揉郑現(xiàn)在也需要注意庫的依賴順序和添加順序有關(guān)系。

  • 查找特定名稱的庫
    因為之前項目中歷史遺留問題生成的庫沒有按照標(biāo)準(zhǔn)的libxx.a或者libxx.so寫法捂襟,需要手動制定特定的位置以及文件名咬腕。

    find_library(KERNEL_DRV NAMES xxx.a PATHS ${PROJECT_LIB_PATH})  
    
    在指定的 PROJECT_LIB_PATH路徑下尋找xxx.a文件。生成變量保存在KERNEL_DRV_NAMES變量中葬荷。
    
  • 編譯的不同時期執(zhí)行特定的腳本
    部分項目涨共,因為屬于不同項目組,沒有統(tǒng)一編譯的環(huán)境宠漩,而且他們也不準(zhǔn)備花時間統(tǒng)一举反,所以用他們的最新的庫,需要使用腳本來進行編譯... ...
    到此處扒吁,我用cmake改寫的過程中深深的體會到了火鼻,隊友的重要性。
    add_custom_command(TARGET demo PRE_BUILD
    COMMAND echo ARGS "##### build xxx start ###### "
    WORKING_DIRECTORY $ENV{xxxxx})
    在WORKING_DIRECTORY 目錄xxxxx中執(zhí)行腳本雕崩。對象為demo魁索,也就是說在編譯demo之前執(zhí)行以上腳本。但是cmake的文檔中好像提到PRE_BUILD只在特定的編譯環(huán)境有效果盼铁,所以在一般情況下粗蔚,表示鏈接階段。

總結(jié)

  • cmake 語法的特點饶火,使用大寫變量表示變量類型
  • prefix機制鹏控,不少地方定義一個變量xxx以后.實際是定義了一個${prefix}致扯,會有 cmake中,類似全局變量的${prefix}_xxx存在当辐,可以直接調(diào)用抖僵。比如前面說的pkg-config

疑問

  • 變量的作用域。
  • 變量的初始化瀑构,在改寫工程過程中,初始化已經(jīng)定義的list刨摩,不再有效寺晌。(類型設(shè)置有問題?澡刹?呻征?)
  • 函數(shù)和marco的區(qū)別聯(lián)系初看文檔說是主要變量作用域的區(qū)別,暫時沒來得及細(xì)看罢浇,目前使用的是marco

主要參考資料

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末陆赋,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子嚷闭,更是在濱河造成了極大的恐慌攒岛,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件胞锰,死亡現(xiàn)場離奇詭異灾锯,居然都是意外死亡,警方通過查閱死者的電腦和手機嗅榕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進店門顺饮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人凌那,你說我怎么就攤上這事兼雄。” “怎么了帽蝶?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵赦肋,是天一觀的道長。 經(jīng)常有香客問我励稳,道長金砍,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任麦锯,我火速辦了婚禮恕稠,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘扶欣。我一直安慰自己鹅巍,他們只是感情好千扶,可當(dāng)我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著骆捧,像睡著了一般澎羞。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上敛苇,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天妆绞,我揣著相機與錄音,去河邊找鬼枫攀。 笑死括饶,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的来涨。 我是一名探鬼主播图焰,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼蹦掐!你這毒婦竟也來了技羔?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤卧抗,失蹤者是張志新(化名)和其女友劉穎藤滥,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體社裆,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡超陆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了浦马。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片时呀。...
    茶點故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖晶默,靈堂內(nèi)的尸體忽然破棺而出谨娜,到底是詐尸還是另有隱情,我是刑警寧澤磺陡,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布趴梢,位于F島的核電站,受9級特大地震影響币他,放射性物質(zhì)發(fā)生泄漏坞靶。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一蝴悉、第九天 我趴在偏房一處隱蔽的房頂上張望彰阴。 院中可真熱鬧,春花似錦拍冠、人聲如沸尿这。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽射众。三九已至碟摆,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間叨橱,已是汗流浹背典蜕。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留罗洗,地道東北人愉舔。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像栖博,于是被迫代替她去往敵國和親屑宠。 傳聞我的和親對象是個殘疾皇子厢洞,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,060評論 2 355

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

  • 1.安裝 $sudo apt-get install cmake 2.示例:簡單的文件目錄 sample |—...
    荷包蛋醬閱讀 29,652評論 0 15
  • 注:首發(fā)地址 1. 前言 當(dāng)在做 Android NDK 開發(fā)時仇让,如果不熟悉用 CMake 來構(gòu)建,讀不懂 CMa...
    cfanr閱讀 24,397評論 1 53
  • 剛才認(rèn)真的聽完了楊亮老師的講話躺翻,大師就是大師丧叽。身份定位:我是誰?喚醒者:支持者公你,陪伴者踊淳,引領(lǐng)者。每個人都圓潤俱足陕靠。...
    自我探索閱讀 100評論 0 0
  • 晚飯后迂尝,一個人在樓區(qū)散步。 好久沒這么漫無目的地走了剪芥,因為總控制不住向前奔垄开。生命似乎是一段一段的,過了一段平靜期税肪,...
    方佳水閱讀 131評論 2 4
  • 今夕是何夕溉躲,往日如流水般一樣,匆匆而過益兄,時時感嘆時間過得飛快锻梳,而我們正在時間里充當(dāng)著過客,我們所走的路净捅,都是暫借的...
    盧小碩閱讀 296評論 0 1