linux編譯器的下關於gcc、g++、make和CMake幾個概念的區別

1-什麼是gcc / g++???

首先說明:gcc 和 GCC 是兩個不同的東西
GCC:GNU Compiler Collection(GUN編譯器集合),它可以編譯C、C++、JAV、Fortran、Pascal、Object-C、Ada等語言。
gcc是GCC中的GUN C Compiler(C 編譯器),g++是GCC中的GUN C++ Compiler(C++編譯器);

就本質而言,gcc和g++並不是編譯器,也不是編譯器的集合,它們只是一種驅動器,根據參數中要編譯的文件的類型,調用對應的GUN編譯器而已;
由於編譯器是可以更換的,所以gcc不僅僅可以編譯C文件
所以,更準確的說法是:gcc調用了C compiler,而g++調用了C++ compiler
gcc和g++的主要區別
1. 對於 *.c和*.cpp文件,gcc分別當做c和cpp文件編譯(c和cpp的語法強度是不一樣的)
2. 對於 *.c和*.cpp文件,g++則統一當做cpp文件編譯
3. 使用g++編譯文件時,g++會自動鏈接標準庫STL,而gcc不會自動鏈接STL
4. gcc在編譯C文件時,可使用的預定義宏是比較少的
5.gcc在編譯cpp文件時/g++在編譯c文件和cpp文件時(這時候gcc和g++調用的都是cpp文件的編譯器),會加入一些額外的宏,這些宏如下:

#define __GXX_WEAK__ 1
#define __cplusplus 1
#define __DEPRECATED 1
#define __GNUG__ 4
#define __EXCEPTIONS 1
#define __private_extern__ extern

6.在用gcc編譯c++文件時,爲了能夠使用STL,需要加參數 –lstdc++ ,但這並不代表 gcc –lstdc++ 和 g++等價,它們的區別不僅僅是這個

主要參數
-g - turn on debugging (so GDB gives morefriendly output)
-Wall - turns on most warnings
-O or -O2 - turn on optimizations
-o - name of the output file
-c - output an object file (.o)
-I - specify an includedirectory
-L - specify a libdirectory
-l - link with librarylib.a

使用示例:g++ -o helloworld -I /homes/me/randomplace/include helloworld.C

      當你的程序只有一個源文件(如c語言的文件)時,直接就可以用gcc命令編譯它。但是當你的程序包含很多個源文件時,用gcc命令逐個去編譯時,你就很容易混亂而且工作量大,所以出現了make工具;

2.make

make工具可以看成是一個智能的批處理工具,它本身並沒有編譯和鏈接的功能,而是用類似於批處理的方式—通過調用makefile文件中用戶指定的命令來進行編譯和鏈接的。

makefile是什麼?簡單的說就像一首歌的樂譜,make工具就像指揮家,指揮家根據樂譜指揮整個樂團怎麼樣演奏,make工具就根據makefile中的命令進行編譯和鏈接的。
          makefile命令中就包含了調用gcc(也可以是別的編譯器)去編譯某個源文件的命令。
          makefile在一些簡單的工程完全可以人工手寫(簡單的書寫-教程地址https://www.cnblogs.com/sld666666/archive/2010/04/08/1707789.html),但是當工程非常大的時候,手寫makefile也是非常麻煩的,如果換了個平臺makefile又要重新修改。這時候就出現了Cmake這個工具(不需要寫makefile--語法嚴格相對複雜,需要寫Cmakelist.txt--更簡單的方式,通過Cmakelist自動生成makefile文件,附:Cmakelist的書寫教程https://www.cnblogs.com/cv-pr/p/6206921.html);

3.CMake

CMake是一種跨平臺編譯工具,比make更爲高級,使用起來要方便得多。CMake主要是編寫CMakeLists.txt文件,然後用cmake命令將CMakeLists.txt文件轉化爲make所需要的makefile文件,最後用make命令編譯源碼生成可執行程序或共享庫(so(shared object)).它的作用和qt的qmake是相似的。

cmake就可以更加簡單的生成makefile文件給上面那個make用。當然cmake還有其他功能,就是可以跨平臺生成對應平臺能用的makefile,你不用再自己去修改了。
      可是cmake根據什麼生成makefile呢?它又要根據一個叫CMakeLists.txt文件(學名:組態檔)去生成makefile。
到最後CMakeLists.txt文件誰寫啊?親,是你自己手寫的(見附加的教程)。

當然如果你用IDE,類似VS這些一般它都能幫你弄好了,你只需要按一下那個三角形-編譯
cmake是make maker,生成各種可以直接控制編譯過程的控制器的配置文件,比如makefile、各種IDE的配置文件。
make是一個簡單的通過文件時間戳控制自動過程、處理依賴關係的軟件,這個自動過程可以是編譯一個項目。

4.linux下的其他常用編譯工具

在linux系統下搞嵌入式開發,交叉編譯器那肯定是必備工具。用的場合多了,就會見到各種各樣的編譯工具,比如:

arm-linux-gcc
arm-linux-gnueabi-gcc
arm-none-linux-eabi-gcc
arm-none-symbianelf-gcc
arm-none-uclinuxeabi-gcc
arm-none-linux-gnueabi-gcc
arm-cortex_a8-linux-gnueabi-gcc
mips-malta-linux-gnu-gcc

詳細解析參考:https://blog.csdn.net/LEON1741/article/details/81537529

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章