gcc與make與CMake
剛加入IT的程式設計師們,可能對gcc、make和CMake深感疑惑。甚至對於那些長期使用IDE做開發的人員來說,可能工作幾年後都不知道make、CMake是什麼東西。下面就來總結一下他們的關係:
- gcc是GNU Compiler Collection(就是GNU編譯器套件),也可以簡單認為是編譯器,它可以編譯很多種程式語言(括C、C++、Objective-C、Fortran、Java等等)。
- 當你的程式只有一個原始檔時,直接就可以用gcc命令編譯它。
- 但是當你的程式包含很多個原始檔時,用gcc命令逐個去編譯時,你就很容易混亂而且工作量大。
- 所以出現了make工具:make工具可以看成是一個智慧的批處理工具,它本身並沒有編譯和連結的功能,而是用類似於批處理的方式—通過呼叫makefile檔案中使用者指定的命令來進行編譯和連結的。
- makefile是什麼?簡單的說就像一首歌的樂譜,make工具就像指揮家,指揮家根據樂譜指揮整個樂團怎麼樣演奏,make工具就根據makefile中的命令進行編譯和連結的。
- makefile命令中就包含了呼叫gcc(也可以是別的編譯器)去編譯某個原始檔的命令。
- makefile在一些簡單的工程完全可以人工手下,但是當工程非常大的時候,手寫makefile也是非常麻煩的,如果換了個平臺makefile又要重新修改。
- 這時候就出現了Cmake這個工具,cmake就可以更加簡單的生成makefile檔案給上面那個make用。當然cmake還有其他功能,就是可以跨平臺生成對應平臺能用的makefile,你不用再自己去修改了。
- 可是cmake根據什麼生成makefile呢?它又要根據一個叫CMakeLists.txt檔案(學名:組態檔)去生成makefile。
- 到最後CMakeLists.txt檔案誰寫啊?親,是你自己手寫的。
- 當然如果你用IDE,類似VS這些一般它都能幫你弄好了,你只需要按一下那個三角形(編譯按鈕)。
總結起來就是:
- gcc是編譯器,其實後還有聯結器等。
- make是另外一個程式,根據makefile的指示,儘可能協調編一個程式套件的編譯全過程,一個程式套件可能包好多多原始碼,也可能生成若干二進位制檔案,還可能指示程式套件的安裝程式製作和/或安裝過程,那make就通過呼叫編譯器聯結器還有其他外部工具達成這一系列工作。make不光可以呼叫gcc編譯器,也可以呼叫javac啊。makefile精力集中於定義工作流水線。
- CMake是另外一個更高層一點的工具,它的輸出是makefile等。支援使用更簡單的語言描述編譯安裝過程。支援多個makefile系列、VisualStudio等。