基本概念(2)——make、ninja、nmake、jom
不用在命令行手動輸入編譯命令,把這些命令寫到一個txt文件內,調用make或者ninja工具自動執行編譯過程
make與makefile
多數內容copy自youtube的一個視頻:https://www.youtube.com/watch?v=E1_uuFWibuM
執行環境:原作者是在Linux下做的視頻,而我使用的是win10,win10下使用mingw-w64、msys2來安裝win下的gcc與make工具。安裝mingw-w64和msys2(我安裝后是不帶make工具的,pacman命令安裝的make)后配置下環境變量就可以使用gcc和make工具了。文本編輯器使用的是VS code。
一個可能用到的知識補充:https://www.biaodianfu.com/cygwin-ming-msys.html
mingw-w64官網:https://mingw-w64.org/doku.php/start
msys2官網:http://www.msys2.org/
為什么要用makefile
(1)簡單編譯一個c文件
命令:
gcc main.c -o main.exe
執行后會得到一個main.exe的文件。在控制臺中執行下:
這樣就得到了輸出。但是,如果.c文件很多,參數也很多,gcc的命令就會很長,源文件做一點點的修改就要執行一次冗長的gcc命令。這時候就可以使用make工具,寫一個makefile文件來執行編譯。makefile的寫法:
target是要編譯的結果,冒號后面的dependencies是依賴,command是要執行的命令(command前面是一個tab不是空格),例如:
去控制臺執行一下:
多個c文件的情況
為了試驗,寫下如下代碼,共三個文件:
如果直接使用gcc命令編譯的話,命令是:gcc main.c sayHello.c -o main.exe 如果文件特別多,只修改部分文件然后執行所有文件全部編譯的話,明顯會浪費時間。所以,這種情況下,就是對每個c文件單獨編譯,比如上圖中的sayHello.c單獨編譯成sayHello.o,最后鏈接到main.c文件。借用原視頻中的一個圖來說明下:
那么,針對我第一張圖中sayHello.c的makefaile就應該想下面這樣寫:
main.exe: main.c sayHello.o
gcc main.c sayHello.o -o main.exe
sayHello.o: sayHello.c
gcc -c sayHello.c -o sayHello.o
注意,按照順序,是從上向下寫,但編譯是從下向上編譯,也就是說,先編譯sayHello.c成sayHello.o,然后編譯main.c sayHello.o。注意上面編譯sayHello.c的時候有個-c參數,意思是把源文件編譯成.o的中間文件而不是.exe的可執行文件。
去執行下:
至此,已經得到的編譯的結果并且執行也沒問題,但是,由于編譯過程中出現了中間文件*.o,編譯后就沒用了,如果有很多的話一個個刪除不現實,所以在makefile中可以添加一個clean,如下:
main.exe: main.c sayHello.o
gcc main.c sayHello.o -o main.exe
sayHello.o: sayHello.c
gcc -c sayHello.c -o sayHello.o
clean:
rm *.o
執行下make clean就可以清理了:
makefile文件中的變量
上圖中有三個c文件,分別都使用了“gcc”這個名字,試想下,如果有一百個c文件,那么就要寫一百次gcc,如果換編譯器,就要每一個都要修改,所以,使用一個變量來代替“gcc”就顯得很有必要了。
執行效果如下:
下面也是變量的用法示例:
多個main函數的情況
上圖是原視頻中的makefile文件,換到win下,需要在可執行文件下添加.exe,例如我的例子就可以寫成下面這樣:
1、目錄文件,我修改了兩個main文件一個是main1.c另外一個是main2.c, 這兩個文件內容是完全一樣的
2、修改makefaile內容,變化部分用紅色標出
3、去執行下
nmake
可以理解成微軟家的make,隨著vs安裝
jom
qt的定制nmake
jom是nmake的克隆,可支持并行執行多個獨立命令。它基本上增加了-j命令行開關,類似于GNU make。原始博客文章仍可以在Qt博客上找到。 https://wiki.qt.io/Jom
一般make可以加一個參數-j表示使用多少個線程來編譯,-j4就表示使用4個線程編譯.
linux下使用make,而在windows上面使用nmake,是vs提供的一個東西,但是有很個坑的事,就是nmake不支持-j這個參數,,也是就是說它是單線程編譯,Qt為了解決這樣子的一個問題,弄出一個jom.exe,這和make的功能基本是一樣的,但是他比nmake多出來的就是,-j這個參數.也就是說它支持多線程編譯.
來自 https://bbs.csdn.net/topics/392205042
總結
以上是生活随笔為你收集整理的基本概念(2)——make、ninja、nmake、jom的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【算法竞赛学习】资金流入流出预测-挑战B
- 下一篇: 联想小新 Air 14 2023 烟霞紫