CMake 教程

1. 編譯單目錄工程

1.創(chuàng)建工程文件夾

mkdir hello #工程目錄
cd hello
mkdir src   # 存放源代碼的目錄
mkdir build # 存放編譯中間代碼和目標(biāo)代碼的目錄

2.進(jìn)入src目錄萝玷,編寫一個(gè)main.c文件

#include <stdio.h>

int main(int argc, char **argv)
{
    printf("hello world\n");
    return 0;
}

3.編寫工程頂層目錄的CMakeLists.txt

cmake_minumum_required(VERSION 2.6)

#指定項(xiàng)目名
project(hello)

#指定子目錄
add_subdirectory(src)

4.編寫子目錄srcCMakeLists.txt

aux_source_directory(. SRC_LIST)

add_executable(hello ${SRC_LIST})

5.編譯工程

1.進(jìn)入build 目錄
2.執(zhí)行命令cmake ..創(chuàng)建Makefile
3.執(zhí)行命令make編譯工程
4.在build的子目錄src生成了執(zhí)行文件

2. 編譯多目錄工程

1.創(chuàng)建工程目錄

mkdir hello # 工程目錄
cd hello
mkdir src   # 存放源碼目錄
mkdir build # 存放編譯產(chǎn)生的中間文件
cd src      
mkdir hello # 存放hello 模塊
mkdir world # 存放world 模塊

2.編寫hello模塊

  • 進(jìn)入hello目錄
  • 編寫hello.h文件
#ifndef  HELLO_H
#define  HELLO_H

void Hello_Print(void);

#endif
  • 編寫hello.c文件
#include "hello.h"

#include <stdio.h>

void Hello_Print(void)
{
    printf("hello ");
}

  • 編寫CMakeLists.txt 文件
aux_source_directory(. DIR_HELLO_SRC)

add_library(hello_lib ${DIR_HELLO_SRC})

3.編寫world模塊

  • 進(jìn)入world目錄
  • 編寫world.h文件
#ifndef  WORLD_H
#define  WORLD_H

void World_Print(void);

#endif
  • 編寫world.c文件
#include "world.h"

#include <stdio.h>

void World_Print(void)
{
    printf("world");
}

  • 編寫CMakeLists.txt 文件
aux_source_directory(. DIR_WORLD_SRC)

add_library(world_lib ${DIR_WORLD_SRC})

4.編寫主模塊

  • 進(jìn)入src目錄
  • 編寫main.c 文件
#include "hello/hello.h"
#include "world/world.h"

int main(int argc, char **argv)
{
    Hello_Print();
    World_Print();

    return 0
}
  • 編寫CMakeLists.txt 文件
add_source_directory(. DIR_SRC)

# 添加子目錄
add_subdirectory(hello)
add_subdirectory(world)

# 執(zhí)行文件
add_executable(hello_prj ${DIR_SRC})
target_link_libraries(hello_prj ello_lib world_lib)

5.編寫頂層目錄的CMakeLists.txt文件

cmake_minumum_required(VERSION 2.6)

project(hello_prj)

add_subdirectory(src)

3. 動(dòng)態(tài)庫(kù)和靜態(tài)庫(kù)的構(gòu)建和使用

1.使用一個(gè)hello world工程來(lái)展開說(shuō)明
項(xiàng)目結(jié)構(gòu)

|-- CMakeLists.txt
|-- build
|-- include
|   |-- hello
|   |   `-- hello.h
|   `-- world
|       `-- world.h
|-- src
|   |-- CMakeLists.txt
|   |-- hello
|   |   `-- hello.c
|   `-- world
|       `-- world.c
`-- test
    |-- CMakeLists.txt
        `-- mytest.c

2.頂層目錄CMakeLists.txt

 cmake_minimum_required(VERSION 2.6)
 
 project(helloworld)
 
 #設(shè)置庫(kù)文件存放路徑
 set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/build/lib)
 
 #設(shè)置執(zhí)行文件存放路徑
 set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/build/bin)
 
 #獲取當(dāng)前目錄及子目錄(遞歸獲取),添加到頭文件搜索路徑
 function(include_sub_directories_recursively root_dir)
     if (IS_DIRECTORY ${root_dir})               # 當(dāng)前路徑是一個(gè)目錄嗎蕉毯,是的話就加入到包含目錄
         message("include dir: " ${root_dir})
         include_directories(${root_dir})
     endif()
 
     file(GLOB ALL_SUB RELATIVE ${root_dir} ${root_dir}/*) # 獲得當(dāng)前目錄下的所有文件丐黄,讓如ALL_SUB列表中
     foreach(sub ${ALL_SUB})
         if (IS_DIRECTORY ${root_dir}/${sub})
             include_sub_directories_recursively(${root_dir}/${sub}) # 對(duì)子目錄遞歸調(diào)用们衙,包含
         endif()
     endforeach()
 endfunction()
 
 #項(xiàng)目的所有目錄都為頭文件搜索路徑
 include_sub_directories_recursively(${PROJECT_SOURCE_DIR})
 
 #添加庫(kù)文件搜索路徑
 link_directories(
     ${PROJECT_SOURCE_DIR}/build/lib
     )

 #添加子目錄
 add_subdirectory(src)
 add_subdirectory(test)

 #設(shè)置安裝目錄
 set(CMAKE_INSTALL_PREFIX ${PROJECT_SOURCE_DIR}/install)


3.helloworld庫(kù)的源代碼
hello.h文件

#ifndef  HELLO_H
#define  HELLO_H

void Hello_Print(void);

#endif

hello.c文件

#include "hello/hello.h"

#include <stdio.h>

void Hello_Print(void)
{
    printf("hello ");
}

world.h文件

#ifndef  WORLD_H
#define  WORLD_H

void World_Print(void);

#endif

world.c文件

#include "world/world.h"

#include <stdio.h>

void World_Print(void)
{
    printf("world");
}

4.子目錄src下的CMakeLists.txt

 #遞歸獲取當(dāng)前目錄及子目錄下的所有c文件
 file(GLOB_RECURSE c_files "*.c")
 
 #生成動(dòng)態(tài)庫(kù)和靜態(tài)庫(kù)
 add_library(helloworld_lib_shared  SHARED ${c_files})
 add_library(helloworld_lib_static STATIC ${c_files})
 
 #將動(dòng)態(tài)庫(kù)和靜態(tài)庫(kù)的名字設(shè)置為一致
 set_target_properties(helloworld_lib_shared PROPERTIES OUTPUT_NAME "helloworld")
 set_target_properties(helloworld_lib_static PROPERTIES OUTPUT_NAME "helloworld")
 
 #設(shè)置動(dòng)態(tài)庫(kù)版本
 set_target_properties(helloworld_lib_shared PROPERTIES VERSION 1.2 SOVERSION 1)
 
 #安裝動(dòng)態(tài)庫(kù)和靜態(tài)庫(kù)
 INSTALL(TARGETS helloworld_lib_shared helloworld_lib_static
     LIBRARY DESTINATION lib
     ARCHIVE DESTINATION lib)
 
 #安裝頭文件
 INSTALL(DIRECTORY ${PROJECT_SOURCE_DIR}/include/ DESTINATION include)

5.mytest.c文件測(cè)試生成的庫(kù)文件
mytest.c文件

#include "hello/hello.h"
#include "world/world.h"

#include <stdio.h>

int main(int argc, char **argv)
{
    Hello_Print();
    World_Print();

    printf("\n");
    return 0;
}

CMakeLists.txt文件

#遞歸獲取所有當(dāng)前目錄及子目錄下的C文件
file(GLOB_RECURSE c_files ./*.c)
  
#生成執(zhí)行文件
add_executable(mytest ${c_files})
     
#鏈接外部庫(kù)
target_link_libraries(mytest libhelloworld.so)

6.構(gòu)建工程

1.進(jìn)入目錄build
2.執(zhí)行命令: cmake ..
3.執(zhí)行命令: make
4.執(zhí)行命令: make install

4. 指定編譯器和編譯選項(xiàng)

1.CMAKE_C_COMPILER: 指定C編譯器
2.CMAKE_CXX_COMPILTER:指定C++編譯器
3.CMAKE_C_FLAGS: 指定C編譯選項(xiàng)
4.CMAKE_CXX_FLAGS:指定C++編譯選項(xiàng)
5.EXECUTABLE_OUTPUT_PATH: 指定執(zhí)行文件存放目錄
6.LIBRARY_OUTPUT_PATH: 指定庫(kù)文件存放目錄
7.CMAKE_BUILD_TYPE:指定build類型[Debug|Release]
8.BUILD_SHARED_LIBS: 指定默認(rèn)庫(kù)編譯方式[OFF|ON]

上述內(nèi)部變量使用說(shuō)明:
1.CMakeLists.txt文件上使用set命令
2.cmake 命令中指定字支,如: cmake -DCMAKE_C_COMPILER=gcc

add_definitions:添加編譯參數(shù)

5. 配置編譯模塊

6. CMake 常用變量和語(yǔ)句

1.include_directories:指定頭文件搜索路徑
2.link_directories:指定庫(kù)文件搜索路徑
3.add_subdirectory:添加子目錄
4.target_link_libraries:指定文件鏈接庫(kù)文件

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末馆匿,一起剝皮案震驚了整個(gè)濱河市忙菠,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌肆良,老刑警劉巖筛璧,帶你破解...
    沈念sama閱讀 222,590評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件逸绎,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡夭谤,警方通過(guò)查閱死者的電腦和手機(jī)棺牧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)朗儒,“玉大人颊乘,你說(shuō)我怎么就攤上這事∽沓” “怎么了乏悄?”我有些...
    開封第一講書人閱讀 169,301評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)恳不。 經(jīng)常有香客問我檩小,道長(zhǎng),這世上最難降的妖魔是什么烟勋? 我笑而不...
    開封第一講書人閱讀 60,078評(píng)論 1 300
  • 正文 為了忘掉前任识啦,我火速辦了婚禮,結(jié)果婚禮上神妹,老公的妹妹穿的比我還像新娘颓哮。我一直安慰自己,他們只是感情好鸵荠,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,082評(píng)論 6 398
  • 文/花漫 我一把揭開白布冕茅。 她就那樣靜靜地躺著,像睡著了一般蛹找。 火紅的嫁衣襯著肌膚如雪姨伤。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,682評(píng)論 1 312
  • 那天庸疾,我揣著相機(jī)與錄音乍楚,去河邊找鬼。 笑死届慈,一個(gè)胖子當(dāng)著我的面吹牛徒溪,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播金顿,決...
    沈念sama閱讀 41,155評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼臊泌,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了揍拆?” 一聲冷哼從身側(cè)響起渠概,我...
    開封第一講書人閱讀 40,098評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎嫂拴,沒想到半個(gè)月后播揪,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體贮喧,經(jīng)...
    沈念sama閱讀 46,638評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,701評(píng)論 3 342
  • 正文 我和宋清朗相戀三年猪狈,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了塞淹。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,852評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡罪裹,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出运挫,到底是詐尸還是另有隱情状共,我是刑警寧澤,帶...
    沈念sama閱讀 36,520評(píng)論 5 351
  • 正文 年R本政府宣布谁帕,位于F島的核電站峡继,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏匈挖。R本人自食惡果不足惜碾牌,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,181評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望儡循。 院中可真熱鬧舶吗,春花似錦、人聲如沸择膝。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)肴捉。三九已至腹侣,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間齿穗,已是汗流浹背傲隶。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留窃页,地道東北人跺株。 一個(gè)月前我還...
    沈念sama閱讀 49,279評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像脖卖,于是被迫代替她去往敵國(guó)和親帖鸦。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,851評(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
  • 注:首發(fā)地址 1. 前言 當(dāng)在做 Android NDK 開發(fā)時(shí),如果不熟悉用 CMake 來(lái)構(gòu)建馋劈,讀不懂 CMa...
    cfanr閱讀 24,432評(píng)論 1 53
  • 1.安裝 $sudo apt-get install cmake 2.示例:簡(jiǎn)單的文件目錄 sample |—...
    荷包蛋醬閱讀 29,659評(píng)論 0 15
  • cmake只是生層攻锰,能夠生層.o之類文件語(yǔ)句的程序晾嘶,而最終生成.o的還是make 爽一爽 (下面我將cmake生成...
    Myth52125閱讀 6,499評(píng)論 0 2
  • 清晨 陽(yáng)光穿過(guò)薄霧透過(guò)玻璃 散落在我的臉頰上 我的睫毛輕顫 聽見你的拖箱輪與地面摩擦發(fā)出的聲音 我迫不及待的起了身...
    長(zhǎng)相廝閱讀 708評(píng)論 0 0