CMake基本使用

預(yù)定義變量的使用

測試目錄如下:


image.png

可以看到只有兩個源文件hello.c杨赤,test.c哟楷,cd到build目錄執(zhí)行cmake

cmake_minimum_required(VERSION 3.4.1)
project(hello)
message(STATUS "PROJECT_NAME:" ${PROJECT_NAME}) # project函數(shù)里面的值
message(STATUS "CMAKE_MAJOR_VERSION:" ${CMAKE_MAJOR_VERSION}) #cmake主版本號
message(STATUS "CMAKE_MINOR_VERSION:" ${CMAKE_MINOR_VERSION}) #cmake次版本號
message(STATUS "CMAKE_PATCH_VERSION:" ${CMAKE_PATCH_VERSION}) #cmake補丁版本號
message(STATUS "CMAKE_HOST_SYSTEM:" ${CMAKE_HOST_SYSTEM}) #系統(tǒng)
message(STATUS "CMAKE_HOST_SYSTEM_NAME:" ${CMAKE_HOST_SYSTEM_NAME}) #系統(tǒng)名稱
message(STATUS "CMAKE_HOST_SYSTEM_VERSION:" ${CMAKE_HOST_SYSTEM_VERSION}) #系統(tǒng)版本
message(STATUS "CMAKE_HOST_SYSTEM_PROCESSOR:" ${CMAKE_HOST_SYSTEM_PROCESSOR}) #處理器類型
message(STATUS "PROJECT_SOURCE_DIR:" ${PROJECT_SOURCE_DIR}) #cmake命令后緊跟的目錄,一般是工程的根目錄
message(STATUS "PROJECT_BINARY_DIR:" ${PROJECT_BINARY_DIR}) #cmake命令執(zhí)行的目錄
message(STATUS "hello_SOURCE_DIR:" ${hello_SOURCE_DIR}) #cmake命令后緊跟的目錄皆辽,一般是工程的根目錄
message(STATUS "hello_BINARY_DIR:" ${hello_BINARY_DIR}) #cmake命令執(zhí)行的目錄
message(STATUS "CMAKE_CURRENT_SOURCE_DIR:" ${CMAKE_CURRENT_SOURCE_DIR}) #當(dāng)前處理的CMakeLists.txt 所在的路徑
message(STATUS "CMAKE_CURRENT_LIST_FILE:" ${CMAKE_CURRENT_LIST_FILE}) #使用這個變量的CMakeLists.txt路徑
message(STATUS "CMAKE_CURRENT_LIST_LINE:" ${CMAKE_CURRENT_LIST_LINE}) #當(dāng)前變量在CMakeLists.txt文件中的行號
message(STATUS "UNIX:" ${UNIX})
message(STATUS "WIN32:" ${WIN32})
add_subdirectory(test)
include_directories(test) 
add_executable(main ${SRC_LIST})
target_link_libraries(main t)

執(zhí)行結(jié)果:


image.png

系統(tǒng)環(huán)境變量

SET(ENV{CMAKE_INCLUDE_PATH} "hhhh")  #設(shè)置系統(tǒng)環(huán)境變量
message(STATUS "CMAKE_INCLUDE_PATH:" $ENV{CMAKE_INCLUDE_PATH}) #系統(tǒng)環(huán)境變量,使用ENV前綴
1S97DASDF@IDV1I$6GM28`9.png

也可以通過以下方式設(shè)置:


image.png

搜索所有的源文件

aux_source_directory(. SRC_LIST)  //當(dāng)前目錄查找,賦值給變量SRC_LIST
file(GLOB SRC_LIST1 "*.c")
file(GLOB SRC_LIST2 "*.c" "test/*.c") //file方式查找當(dāng)前目錄文捶,test目錄
file(GLOB SRC_LIST3 RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*.c") //輸出相對于指定路徑的結(jié)果
message(STATUS "SRC_LIST:" ${SRC_LIST})
message(STATUS "SRC_LIST1:" ${SRC_LIST1})
message(STATUS "SRC_LIST2:" ${SRC_LIST2})
message(STATUS "SRC_LIST3:" ${SRC_LIST3})
image.png

可以看到SRC_LIST1,SRC_LIST2都是絕對路徑媒咳,SRC_LIST粹排,SRC_LIST3是相對路徑

設(shè)置包含的目錄

一般作用是把頭文件放到搜索路徑下:

include_directories(test) 

hello.c里面頭文件路徑不用修改:

#include <stdio.h>
#include "test.h" //這里就不用絕對路徑了
int main()
{
    printf("PI:%f\n",PI);
    printf("hello world:%d\n",add(1,5));
    return 0;
}

設(shè)置 target 需要鏈接的庫

add_subdirectory(test) // test目錄單獨生成庫文件
include_directories(test) 
add_executable(main ${SRC_LIST})
target_link_libraries(main t)  // 這里可以查找到libt.so

配置文件

配置一個頭文件將一些 CMake 設(shè)置傳入到源代碼中,例如這里定義一個是否Debug的開關(guān)

option (DEBUG "debuggable" ON)  //這個變量定義一定寫在前面
configure_file("${PROJECT_SOURCE_DIR}/config.h.in" "${PROJECT_BINARY_DIR}/config.h") //以 config.h.in 為模版涩澡,替換相關(guān)變量以生成 config.h

在指定目錄新建一個文件config.h.in顽耳,這里文件名可以是其他的,最好有意義


image.png
#cmakedefine DEBUG  //這里使用#cmakedefine

執(zhí)行cmake .. 妙同,在build目錄產(chǎn)生了config.h


W4PCB[]@2Z[`]_R_HDRURR4.png

內(nèi)容如下:

#define DEBUG

可以在CMakeLists.txt中使用這個定義射富,也可以在源文件中使用:

option (DEBUG "debuggable" ON)
configure_file("${PROJECT_SOURCE_DIR}/config.h.in" "${PROJECT_BINARY_DIR}/config.h")
if(DEBUG)
  message(STATUS "DEBUG:" ${DEBUG})
endif(DEBUG)  

執(zhí)行如下:


image.png

在源文件中使用:

#include <stdio.h>
#include "test.h"
#include "build/config.h" //引入頭文件
int main()
{
    printf("PI:%f\n",PI);
    printf("hello world:%d\n",add(1,5));
    #ifdef DEBUG
    printf("debug:%d\n",1); //打印輸出
    #endif
    return 0;
}

執(zhí)行結(jié)果如下:


XS~01GV`6DU%T5NO2(3P_L5.png

設(shè)置編譯類型

add_executable(demo demo.cpp) # 生成可執(zhí)行文件
add_library(common STATIC util.cpp) # 生成靜態(tài)庫
add_library(common SHARED util.cpp) # 生成動態(tài)庫或共享庫

使用shell腳本

新建一個make.sh

#!/bin/bash
cd build
rm -rf *
cmake ..
make
./main

添加可執(zhí)行權(quán)限:chmod u+x make.sh
執(zhí)行結(jié)果:


H@H(5@VANPQGB32VX6(C3$Q.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市粥帚,隨后出現(xiàn)的幾起案子胰耗,更是在濱河造成了極大的恐慌,老刑警劉巖芒涡,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件柴灯,死亡現(xiàn)場離奇詭異卖漫,居然都是意外死亡,警方通過查閱死者的電腦和手機赠群,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門羊始,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人查描,你說我怎么就攤上這事店枣。” “怎么了叹誉?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵鸯两,是天一觀的道長。 經(jīng)常有香客問我长豁,道長钧唐,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任匠襟,我火速辦了婚禮钝侠,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘酸舍。我一直安慰自己帅韧,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布啃勉。 她就那樣靜靜地躺著忽舟,像睡著了一般。 火紅的嫁衣襯著肌膚如雪淮阐。 梳的紋絲不亂的頭發(fā)上叮阅,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天,我揣著相機與錄音泣特,去河邊找鬼浩姥。 笑死,一個胖子當(dāng)著我的面吹牛状您,可吹牛的內(nèi)容都是我干的勒叠。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼膏孟,長吁一口氣:“原來是場噩夢啊……” “哼眯分!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起骆莹,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤颗搂,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后幕垦,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體丢氢,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡傅联,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了疚察。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蒸走。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖貌嫡,靈堂內(nèi)的尸體忽然破棺而出比驻,到底是詐尸還是另有隱情,我是刑警寧澤岛抄,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布别惦,位于F島的核電站,受9級特大地震影響夫椭,放射性物質(zhì)發(fā)生泄漏掸掸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一蹭秋、第九天 我趴在偏房一處隱蔽的房頂上張望扰付。 院中可真熱鬧,春花似錦仁讨、人聲如沸羽莺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽盐固。三九已至,卻和暖如春族跛,著一層夾襖步出監(jiān)牢的瞬間闰挡,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工礁哄, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人溪北。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓桐绒,卻偏偏與公主長得像,于是被迫代替她去往敵國和親之拨。 傳聞我的和親對象是個殘疾皇子茉继,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,577評論 2 353

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

  • 為什么要用cmake?makefile的語法非常復(fù)雜蚀乔,光文檔就有200多頁烁竭,使用起來不方便,只支持linux平臺吉挣,...
    aruba閱讀 1,288評論 0 2
  • 準(zhǔn)備工作 最新版的 CMake(3.8)派撕。 C/C++ 編譯器(GCC婉弹,MSVC,clang)终吼。 編輯器(CLio...
    bdd1b3ad7323閱讀 2,583評論 0 4
  • CMake簡介 CMake 是一個跨平臺的安裝(編譯[https://baike.baidu.com/item/%...
    skycoder閱讀 5,025評論 0 3
  • 注:首發(fā)地址 1. 前言 當(dāng)在做 Android NDK 開發(fā)時镀赌,如果不熟悉用 CMake 來構(gòu)建,讀不懂 CMa...
    cfanr閱讀 24,368評論 1 53
  • 簡介 一际跪、安裝方式 CMake 安裝路徑參見 官網(wǎng)[https://cmake.org/download/]商佛,安裝...
    貓咪不吃魚閱讀 3,694評論 0 1