1. 程式人生 > >CMake,make,CMakeLists.txt,CMakeFiles之間的關係

CMake,make,CMakeLists.txt,CMakeFiles之間的關係

參考https://www.zhihu.com/question/36609459

對於一個只在windows界混的菜鳥程式設計師,平常用Visual Studio(號稱宇宙最強IDE),就能實現新建工程,編寫*.cpp,*.h,編譯(即build,這裡的編譯實際包括了編譯,彙編,連結等等,見下面截圖)

過程神馬的都幫你弄好了,按個快捷鍵(ctrl +shift+B或者F7,好像還可以自定義),Build就開始了。

然而,當我知道CMake後,通常介紹說跨平臺特別方便,高手必備技能,暈了。。。

下面只簡單說下CMake,make,CMakeLists.txt,CMakeFiles之間的關係

1.gcc是GNU Compiler Collection(就是GNU編譯器套件),也可以簡單認為是編譯器,它可以編譯很多種程式語言(括C、C++、Objective-C、Fortran、Java等等)。

2.當你的程式只有一個原始檔時,直接就可以用gcc命令編譯它。

3.但是當你的程式包含很多個原始檔時,用gcc命令逐個去編譯時,你就很容易混亂而且工作量大

4.所以出現了make工具
make工具可以看成是一個智慧的批處理工具,它本身並沒有編譯和連結的功能,而是用類似於批處理的方式—通過呼叫makefile檔案中使用者指定的命令來進行編譯和連結的。

5.makefile是什麼?簡單的說就像一首歌的樂譜,make工具就像指揮家,指揮家根據樂譜指揮整個樂團怎麼樣演奏,make工具就根據makefile中的命令進行編譯和連結的。

6.makefile命令中就包含了呼叫gcc(也可以是別的編譯器)去編譯某個原始檔的命令。

7.makefile在一些簡單的工程完全可以人工手下,但是當工程非常大的時候,手寫makefile也是非常麻煩的,如果換了個平臺makefile又要重新修改。

8.這時候就出現了Cmake這個工具,cmake就可以更加簡單的生成makefile檔案給上面那個make用。當然cmake還有其他功能,就是可以跨平臺生成對應平臺能用的makefile,你不用再自己去修改了。

9.可是cmake根據什麼生成makefile呢?它又要根據一個叫CMakeLists.txt檔案(學名:組態檔)去生成makefile。

10.到最後CMakeLists.txt檔案誰寫啊?親,是你自己手寫的。

舉例

從原始檔

hello.c

生成(構建)可執行檔案

hello

需要執行

gcc hello.c -ohello

將上面的命令寫到一個檔案中,這個檔案就是Makefile檔案,執行make會執行Makefile中的所有命令

cmake是用來生成Makefile檔案的工具,生成Makefile檔案的工具不止有cmake,還有autotools。Qt環境下還有qmake

Windows下CMake,CMakeLists.txt的作用

CMakeLists.txt為描述編譯連結的規則檔案,也就是CMake.exe這個軟體是根據解析這個txt檔案來生成了VS工程檔案(如.sln, vcproject)。個人理解:在windows下,CMakeLists.txt是用來生成組織層次。說白了就是,sln下有多少project,每個project下都有哪些*.cpp,*.h,每個project依賴於哪些其他的project等。

但是,編譯,除錯程式碼,還是用VS。即CMake.exe根據CMakeLists.txt生成了*.sln. 用VS開啟sln,快捷鍵ctrl +shift+B。。。

至於Makefile用·沒用到,我也不清楚。歡迎大神告知。