最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C/C++從零開始的cmake教程

 更新時(shí)間:2018年10月15日 17:31:34   作者:燒煤的快感  
今天小編就為大家分享一篇關(guān)于C/C++從零開始的cmake教程,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧

C/C++從零開始的CMake教程

如果你有過在linux系統(tǒng)上源碼安裝某款軟件的經(jīng)歷,那么肯定對(duì)這三部曲一點(diǎn)都不會(huì)陌生——配置(configure)、編譯(make)、安裝(make install)。幾乎每次都是機(jī)器人般的操作,這背后其實(shí)是make(準(zhǔn)確地說應(yīng)該是GNU Make)在默默為你干了不少活。

1.編譯hello.c——單一源文件的編譯

//hello.c
#include <stdio.h>
int main(){
 puts("hello, world!");
 return 0;
}

為了編譯生成對(duì)應(yīng)的可執(zhí)行文件,你可能會(huì)使用下面的命令:

$ cc -o hello hello.c
$ ./hello
hello, world!

但是,如果使用make(前提是你的操作系統(tǒng)已經(jīng)安裝了GCC和GNU Make),會(huì)顯得更清爽一些。

$ make hello
cc hello.c -o hello
$ ./hello
hello, world!

1.1編寫Makefile

什么?你連“make hello”都懶得寫?看完這部分,你的“妄念”應(yīng)該就能實(shí)現(xiàn)了,到時(shí)候你只需要慢悠悠地打出4個(gè)字母——”make”,然后按下回車鍵,比圖形界面IDE還要方便(至少你不用到處去找那個(gè)該死的“運(yùn)行”按鈕在哪。

這時(shí)候你只要在hello.c的同一個(gè)目錄下新建一個(gè)文件Makefile作為make命令的配置文件即可。它的內(nèi)容很簡單:

hello:

1.2設(shè)定編譯器

什么?你不想使用默認(rèn)的cc,而想使用gcc來編譯程序?那還不簡單,只用在Makefile文件中把CC變量的值賦為gcc就可以了。

CC := gcc
hello:

如果你這時(shí)候想運(yùn)行make試下效果,請(qǐng)注意:make根本就不會(huì)重新編譯生成hello。為什么啊?因?yàn)閙ake很“懶”,因?yàn)樗鼨z測到hello.c和上一次編譯時(shí)一模一樣,再重新編譯生成的可執(zhí)行文件肯定也一樣啊,那就沒有運(yùn)行的必要了,直接返回結(jié)果了。這時(shí)候可以用上些“小手段”,反正make很好騙。輸入下面的命令,更新下hello.c的最近修改日期。

$ touch hello.c

或者干脆直接把hello文件刪掉。但是刪文件的方式也有高招和低招之分,如果你使用的是下面的命令:

$ rm -f hello

那么這就是低招了,因?yàn)檫@很可能誤刪了其他很重要的源文件,造成十分嚴(yán)重的后果。那么高招是什么呢?那就是在Makefile中添加下面的內(nèi)容:

clean:
 $(RM) hello

運(yùn)行方式也很簡單,運(yùn)行make clean命令即可。

1.3增加編譯選項(xiàng)

如果你想為gcc增加-g -Wall -Wextra選項(xiàng),那么只要設(shè)定變量CFLAGS的值即可。

CC := gcc
CFLAGS := -g -Wall -Wextra
hello:
clean:
 $(RM) hello

這時(shí)候,運(yùn)行make clean和make的結(jié)果如下所示:

$ make clean
rm -f hello
$ make
gcc -g -Wall -Wextra hello.c -o hello

2.分塊編譯——編譯有多個(gè)源文件的程序

如果程序不再只有一個(gè)源文件,那么結(jié)合Make的內(nèi)置編譯規(guī)則,也可以很簡潔地編寫Makefile文件完成編譯任務(wù)。下面是一個(gè)簡單的例子:

LDLIBS := -lncurses
block: block.o function.o
block.o function.o: function.h
clean:
 $(RM) *.o
 $(RM) block

其中程序需要用到ncurses,它是一個(gè)字符終端下屏幕控制的基本庫,因此在編譯時(shí)需要在最后增加-lncurses選項(xiàng)。這時(shí)候,可能你已經(jīng)發(fā)現(xiàn)了,其實(shí)編寫Makefile主要內(nèi)容就是編寫依賴關(guān)系,block: block.o function.o就是表示由block.o和function.o鏈接生成可執(zhí)行文件block。同時(shí)bolck.o和function.o就是根據(jù)需要從bolck.c和function.c編譯生成,因?yàn)閙ake有如下內(nèi)置規(guī)則:*.o由同名的c源文件生成,因此不必寫多余的bolck.o:bolck.cfunction.o:function.c 。運(yùn)行結(jié)果如下

$ make
cc -c -o block.o block.c
cc -c -o function.o function.c
cc block.o function.o -lncurses -o block

3.Make的內(nèi)置規(guī)則

輸入make -p命令,可以查看所有的make的內(nèi)置規(guī)則,比如上面提到的*.o由同名的c源文件生成,在make -p的輸出結(jié)果中顯示如下:

%.o: %.c
# recipe to execute (內(nèi)置):
 $(COMPILE.c) $(OUTPUT_OPTION) $<

其中,%為通配符,$(COMPILE.c)是取COMPILE.c這個(gè)變量的值,如果你好奇這個(gè)值到底是什么,可以再繼續(xù)查找,發(fā)現(xiàn)下面的語句

# 默認(rèn)
COMPILE.C = $(COMPILE.cc)

在進(jìn)一步找,得到:

# 默認(rèn)
COMPILE.cc = $(CXX) $(CXXFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c

上面的變量可以像之前的實(shí)例那樣重新賦值(默認(rèn)為空),從而自定義編譯方式。

自動(dòng)變量

除了像$(COMPILE.c)和$(COMPILE.cc)這樣形式的變量,make中還存在一類很常用、無比重要的變量——自動(dòng)變量。
下面列出最常用的自動(dòng)變量:

  • $@ 規(guī)則的生成目標(biāo)
  • $% 檔案文件成員結(jié)構(gòu)中的文件名元素
  • $< 第一個(gè)依賴文件名
  • $^ 所有的依賴文件名(已經(jīng)消重),以空格分隔
  • $+ 所有的依賴文件名(未經(jīng)消重),以空格分隔
  • $* 所有除掉后綴的依賴文件名,以空格分隔,僅適用于模式規(guī)則。注:文件名包含stem和suffix,去掉suffix就剩下了stem。比如hello.cpp的stem是hello,suffix就是cpp。
  • $? 比目標(biāo)文件新的依賴文件。

比如下面這條規(guī)則:

 %: %.c
# commands to execute (built-in):
 $(LINK.c) $^ $(LOADLIBES) $(LDLIBS) -o $@

LINK.c的定義如下:

LINK.c = $(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH)

CC的定義如下:

CC = cc

而且CFLAGS、CPPFLAGS、LDFLAGS、TARGET_ARCH默認(rèn)都為空。
最后原來的規(guī)則等同于:

%: %.c
 cc $^ -o $@

所以本文開頭的編譯hello,只需簡簡單單的Makefile:

hello:

就可得到最終的編譯命令:

cc hello.c -o hello

所以,參考make -p命令輸出的make內(nèi)置規(guī)則,編寫自己程序的Makefile是個(gè)不錯(cuò)的編程習(xí)慣和學(xué)習(xí)如何熟練使用Make的途徑。

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請(qǐng)查看下面相關(guān)鏈接

相關(guān)文章

  • C語言實(shí)現(xiàn)BMP圖像開運(yùn)算處理

    C語言實(shí)現(xiàn)BMP圖像開運(yùn)算處理

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)BMP圖像開運(yùn)算處理,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • C語言?如何用堆解決Topk問題

    C語言?如何用堆解決Topk問題

    TopK問題即在N個(gè)數(shù)中找出最大的前K個(gè),這篇文章將詳細(xì)講解如何利用小根堆的方法解決TopK問題,文中代碼具有一定參考價(jià)值,快跟隨小編一起學(xué)習(xí)一下吧
    2021-12-12
  • C語言編程入門之程序頭文件的簡要解析

    C語言編程入門之程序頭文件的簡要解析

    這篇文章主要介紹了C語言編程入門之程序頭文件的簡要解析,包括頭文件重復(fù)包含問題等方面的說明,需要的朋友可以參考下
    2015-12-12
  • C++基礎(chǔ)教程之指針拷貝詳解

    C++基礎(chǔ)教程之指針拷貝詳解

    這篇文章主要介紹了C++基礎(chǔ)教程之指針拷貝詳解的相關(guān)資料,需要的朋友可以參考下
    2017-01-01
  • C++實(shí)現(xiàn)LeetCode(92.倒置鏈表之二)

    C++實(shí)現(xiàn)LeetCode(92.倒置鏈表之二)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(倒置鏈表之二),本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C語言驅(qū)動(dòng)開發(fā)內(nèi)核枚舉IoTimer定時(shí)器解析

    C語言驅(qū)動(dòng)開發(fā)內(nèi)核枚舉IoTimer定時(shí)器解析

    這篇文章主要為大家介紹了C語言驅(qū)動(dòng)開發(fā)內(nèi)核枚舉IoTimer定時(shí)器解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • C++容器map和pair對(duì)組實(shí)例詳解

    C++容器map和pair對(duì)組實(shí)例詳解

    pair?是一種模板類,允許將兩個(gè)不同類型的值組合在一起,它由兩個(gè)數(shù)據(jù)成員first和second組成,分別用來保存這兩個(gè)值,這篇文章主要介紹了C++容器——map和pair對(duì)組,需要的朋友可以參考下
    2024-05-05
  • C語言自定義類型的保姆級(jí)講解

    C語言自定義類型的保姆級(jí)講解

    這篇文章主要給大家介紹了關(guān)于C語言自定義類型的保姆級(jí)講解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • 基于C++實(shí)現(xiàn)TCP聊天室功能

    基于C++實(shí)現(xiàn)TCP聊天室功能

    這篇文章主要為大家詳細(xì)介紹了基于C++實(shí)現(xiàn)TCP聊天室功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • 使用mmap實(shí)現(xiàn)大文件的復(fù)制(單進(jìn)程和多進(jìn)程)

    使用mmap實(shí)現(xiàn)大文件的復(fù)制(單進(jìn)程和多進(jìn)程)

    這篇文章主要為大家詳細(xì)介紹了使用mmap實(shí)現(xiàn)大文件的復(fù)制,單進(jìn)程與多進(jìn)程的兩種情況,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-10-10

最新評(píng)論

金溪县| 霍山县| 报价| 瓮安县| 兰西县| 张家口市| 汉阴县| 基隆市| 嘉黎县| 廉江市| 临湘市| 石景山区| 大姚县| 祁东县| 田东县| 南昌市| 乌审旗| 察雅县| 日照市| 靖边县| 抚远县| 赣州市| 洪雅县| 长顺县| 黎平县| 新兴县| 汉寿县| 东乡县| 阳曲县| 巫山县| 扶沟县| 安阳市| 呼和浩特市| 洞口县| 道真| 吉木萨尔县| 遵义县| 衡南县| 玉环县| 监利县| 喜德县|