国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

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

2020-01-26 13:38:33
字體:
供稿:網(wǎng)友

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

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

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

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

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

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

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

$ make hellocc hello.c -o hello$ ./hellohello, world!

1.1編寫Makefile

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

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

hello:

1.2設(shè)定編譯器

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

CC := gcchello:

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

$ touch hello.c

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

$ rm -f hello

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

clean: $(RM) hello

運行方式也很簡單,運行make clean命令即可。

1.3增加編譯選項

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

CC := gccCFLAGS := -g -Wall -Wextrahello:clean: $(RM) hello

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

$ make cleanrm -f hello$ makegcc -g -Wall -Wextra hello.c -o hello

2.分塊編譯――編譯有多個源文件的程序

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

LDLIBS := -lncursesblock: block.o function.oblock.o function.o: function.hclean: $(RM) *.o $(RM) block

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

$ makecc -c -o block.o block.ccc -c -o function.o function.ccc 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這個變量的值,如果你好奇這個值到底是什么,可以再繼續(xù)查找,發(fā)現(xiàn)下面的語句

# 默認COMPILE.C = $(COMPILE.cc)

在進一步找,得到:

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

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

自動變量

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

  • $@ 規(guī)則的生成目標(biāo)
  • $% 檔案文件成員結(jié)構(gòu)中的文件名元素
  • $< 第一個依賴文件名
  • $^ 所有的依賴文件名(已經(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默認都為空。
最后原來的規(guī)則等同于:

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

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

hello:

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

cc hello.c -o hello

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

總結(jié)

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

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 界首市| 定兴县| 益阳市| 孝感市| 龙州县| 万宁市| 庆安县| 镇赉县| 昌吉市| 城市| 房山区| 庐江县| 蒙山县| 综艺| 龙岩市| 华池县| 绥棱县| 新干县| 衡南县| 临洮县| 甘孜| 邵东县| 新野县| 平舆县| 洪泽县| 五大连池市| 舞钢市| 年辖:市辖区| 平度市| 海安县| 桂林市| 永丰县| 高陵县| 石门县| 白银市| 五莲县| 兴宁市| 天峻县| 承德市| 乌鲁木齐市| 米脂县|