小編給大家分享一下C/C++中cmake怎么用,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
1.編譯hello.c——單一源文件的編譯
//hello.c #include <stdio.h> int main(){ puts("hello, world!"); return 0; }
為了編譯生成對應的可執行文件,你可能會使用下面的命令:
$ cc -o hello hello.c $ ./hello hello, world!
但是,如果使用make(前提是你的操作系統已經安裝了GCC和GNU Make),會顯得更清爽一些。
$ make hello cc hello.c -o hello $ ./hello hello, world!
1.1編寫Makefile
什么?你連“make hello”都懶得寫?看完這部分,你的“妄念”應該就能實現了,到時候你只需要慢悠悠地打出4個字母——”make”,然后按下回車鍵,比圖形界面IDE還要方便(至少你不用到處去找那個該死的“運行”按鈕在哪。
這時候你只要在hello.c的同一個目錄下新建一個文件Makefile作為make命令的配置文件即可。它的內容很簡單:
hello:
1.2設定編譯器
什么?你不想使用默認的cc,而想使用gcc來編譯程序?那還不簡單,只用在Makefile文件中把CC變量的值賦為gcc就可以了。
CC := gcc hello:
如果你這時候想運行make試下效果,請注意:make根本就不會重新編譯生成hello。為什么???因為make很“懶”,因為它檢測到hello.c和上一次編譯時一模一樣,再重新編譯生成的可執行文件肯定也一樣啊,那就沒有運行的必要了,直接返回結果了。這時候可以用上些“小手段”,反正make很好騙。輸入下面的命令,更新下hello.c的最近修改日期。
$ touch hello.c
或者干脆直接把hello文件刪掉。但是刪文件的方式也有高招和低招之分,如果你使用的是下面的命令:
$ rm -f hello
那么這就是低招了,因為這很可能誤刪了其他很重要的源文件,造成十分嚴重的后果。那么高招是什么呢?那就是在Makefile中添加下面的內容:
clean: $(RM) hello
運行方式也很簡單,運行make clean命令即可。
1.3增加編譯選項
如果你想為gcc增加-g -Wall -Wextra選項,那么只要設定變量CFLAGS的值即可。
CC := gcc CFLAGS := -g -Wall -Wextra hello: clean: $(RM) hello
這時候,運行make clean和make的結果如下所示:
$ make clean rm -f hello $ make gcc -g -Wall -Wextra hello.c -o hello
2.分塊編譯——編譯有多個源文件的程序
如果程序不再只有一個源文件,那么結合Make的內置編譯規則,也可以很簡潔地編寫Makefile文件完成編譯任務。下面是一個簡單的例子:
LDLIBS := -lncurses block: block.o function.o block.o function.o: function.h clean: $(RM) *.o $(RM) block
其中程序需要用到ncurses,它是一個字符終端下屏幕控制的基本庫,因此在編譯時需要在最后增加-lncurses選項。這時候,可能你已經發現了,其實編寫Makefile主要內容就是編寫依賴關系,block: block.o function.o
就是表示由block.o和function.o鏈接生成可執行文件block。同時bolck.o和function.o就是根據需要從bolck.c和function.c編譯生成,因為make有如下內置規則:*.o由同名的c源文件生成,因此不必寫多余的bolck.o:bolck.c
和function.o:function.c
。運行結果如下
$ 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的內置規則
輸入make -p
命令,可以查看所有的make的內置規則,比如上面提到的*.o由同名的c源文件生成,在make -p的輸出結果中顯示如下:
%.o: %.c # recipe to execute (內置): $(COMPILE.c) $(OUTPUT_OPTION) $<
其中,%為通配符,$(COMPILE.c)是取COMPILE.c這個變量的值,如果你好奇這個值到底是什么,可以再繼續查找,發現下面的語句
# 默認 COMPILE.C = $(COMPILE.cc)
在進一步找,得到:
# 默認 COMPILE.cc = $(CXX) $(CXXFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c
上面的變量可以像之前的實例那樣重新賦值(默認為空),從而自定義編譯方式。
自動變量
除了像$(COMPILE.c)和$(COMPILE.cc)這樣形式的變量,make中還存在一類很常用、無比重要的變量——自動變量。
下面列出最常用的自動變量:
$@ 規則的生成目標
$% 檔案文件成員結構中的文件名元素
$< 第一個依賴文件名
$^ 所有的依賴文件名(已經消重),以空格分隔
$+ 所有的依賴文件名(未經消重),以空格分隔
$* 所有除掉后綴的依賴文件名,以空格分隔,僅適用于模式規則。注:文件名包含stem和suffix,去掉suffix就剩下了stem。比如hello.cpp的stem是hello,suffix就是cpp。
$? 比目標文件新的依賴文件。
比如下面這條規則:
%: %.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默認都為空。
最后原來的規則等同于:
%: %.c cc $^ -o $@
所以本文開頭的編譯hello,只需簡簡單單的Makefile:
hello:
就可得到最終的編譯命令:
cc hello.c -o hello
所以,參考make -p
命令輸出的make內置規則,編寫自己程序的Makefile是個不錯的編程習慣和學習如何熟練使用Make的途徑。
以上是“C/C++中cmake怎么用”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。