編譯C語言程序,使用 gcc 指令,而C++程序則推薦使用 g++指令!

2021-02-20 嵌入式資訊精選

素材來源:C語言中文網

編輯整理:strongerHuang

目前(2020-09)GCC 編譯器已經更新至 10.2版本,其功能也由最初僅能編譯 C 語言,擴增至可以編譯多種程式語言,其中就包括 C++ 。

除此之外,當下的 GCC 編譯器還支持編譯 Go、Objective-C,Objective-C ++,Fortran,Ada,D 和 BRIG(HSAIL)等程序,甚至於 GCC 6 以及之前的版本還支持編譯 Java 程序。但本教程主要講解如何使用 GCC 編譯器編譯運行 C 和 C++ 程序,因此有關其它程式語言如何使用 GCC 編譯器編譯,將不再做具體講解。

那麼,在已編輯好 C 語言或者 C++ 代碼的前提下,如何才能調用 GCC 編譯器為我們編譯程序呢?很簡單,GCC 編譯器已經為我們提供了調用它的接口,對於 C 語言或者 C++ 程序,可以通過執行 gcc 或者 g++ 指令來調用 GCC 編譯器。

值得一提的是,實際使用中我們更習慣使用 gcc 指令編譯 C 語言程序,用 g++ 指令編譯 C++ 代碼。需要強調的一點是,這並不是 gcc 和 g++ 的區別,gcc 指令也可以用來編譯 C++ 程序,同樣 g++ 指令也可以用於編譯 C 語言程序。

那麼,gcc 和 g++ 的區別是什麼呢?接下來就給讀者做詳細的講解。

實際上,只要是 GCC 支持編譯的程序代碼,都可以使用 gcc 命令完成編譯。可以這樣理解,gcc 是 GCC 編譯器的通用編譯指令,因為根據程序文件的後綴名,gcc 指令可以自行判斷出當前程序所用程式語言的類別,比如:

xxx.c:默認以編譯 C 語言程序的方式編譯此文件;

xxx.cpp:默認以編譯 C++ 程序的方式編譯此文件。

xxx.m:默認以編譯 Objective-C 程序的方式編譯此文件;

xxx.go:默認以編譯 Go 語言程序的方式編譯此文件;

當然,gcc 指令也為用戶提供了「手動指定代表編譯方式」的接口,即使用 -x 選項。例如,gcc -xc xxx 表示以編譯 C 語言代碼的方式編譯 xxx 文件;而 gcc -xc++ xxx 則表示以編譯 C++ 代碼的方式編譯 xxx 文件。有關 -x 選項的用法,後續會給出具體樣例。

但如果使用 g++ 指令,則無論目標文件的後綴名是什麼,該指令都一律按照編譯 C++ 代碼的方式編譯該文件。也就是說,對於 .c 文件來說,gcc 指令以 C 語言代碼對待,而 g++ 指令會以 C++ 代碼對待。但對於 .cpp 文件來說,gcc 和 g++ 都會以 C++ 代碼的方式編譯。

有讀者可能會認為,C++ 兼容 C 語言,因此對於 C 語言程序來說,使用 gcc 編譯還是使用 g++ 編譯,應該沒有什麼區別,事實並非如此。嚴格來說,C++ 標準和 C 語言標準的語法要求是有區別的。舉個例子:

#include <stdio.h>int main(){    const char * a = "abc";    printStr(a);    return;}int printStr(const char* str){    printf(str);}

如上所示,這是一段不規範的 C 語言代碼。如果我們使用 gcc 指令編譯,如下所示:

[root@bogon ~]# gcc -xc demo.c   #或者直接運行 gcc demo.c
[root@bogon ~]#

可以看到,該指令的執行過程並沒有發生任何錯誤。而同樣的程序,如果我們使用 g++ 指令編譯:

[root@bogon ~]# g++ demo.c
demo.c: In function 『int main()』:
demo.c:5: error: 『printStr』 was not declared in this scope
demo.c:6: error: return-statement with no value, in function returning 『int』
[root@bogon ~]# 

可以看到,GCC 編譯器發現了 3 處錯誤。顯然,C++ 標準對代碼書寫規範的要求更加嚴格。

除此之外對於編譯執行 C++ 程序,使用 gcc 和 g++ 也是有區別的。要知道,很多 C++ 程序都會調用某些標準庫中現有的函數或者類對象,而單純的 gcc 命令是無法自動連結這些標準庫文件的。舉個例子:

#include <iostream>#include <string>using namespace std;int main(){    string str ="C語言中文網";    cout << str << endl;    return 0;}

這是一段很簡單的 C++ 程序,其通過 <string> 頭文件提供的 string 字符串類定義了一個字符串對象,隨後使用 cout 輸出流對象將其輸出。對於這段 C++ 代碼,如果我們使用 g++ 指令編譯,如下所示:

[root@bogon ~]# g++ demo.cpp
[root@bogon ~]#

可以看到,整個編譯過程沒有報任何錯誤。但如果使用 gcc 指令:

[root@bogon ~]# gcc demo.cpp
/tmp/ccIOnwra.o: In function `main':
demo.cpp:(.text+0x13): undefined reference to `std::allocator<char>::allocator()'
#省略了諸多錯誤信息

讀者可自行編譯,就可以看到很多報錯信息。其根本原因就在於,該程序中使用了標準庫 <iostream> 和<string> 提供的類對象,而 gcc 默認是無法找到它們的。

如果想使用 gcc 指令來編譯執行 C++ 程序,需要在使用 gcc 指令時,手動為其添加 -lstdc++ -shared-libgcc 選項,表示 gcc 在編譯 C++ 程序時可以連結必要的 C++ 標準庫。也就是說,我們可以這樣編譯 demo.cpp 文件:

[root@bogon ~]# gcc -xc++ -lstdc++ -shared-libgcc demo.cpp
[root@bogon ~]#

由此,demo.cpp 就被成功的編譯了。

讀者可以這樣認為,g++ 指令就等同於gcc -xc++ -lstdc++ -shared-libgcc指令。顯然後者書寫是非常麻煩的,大多數人會更喜歡前者。

對於 gcc 和 g++ 指令,還有其它更多細節方面的區別,這裡不再做更多的贅述。讀完本節,讀者只需要知道,對於 C 語言程序的編譯,我們應該使用 gcc 指令,而編譯 C++ 程序則推薦使用 g++ 指令,這就足夠了。

1.疫情常態化,這個安全無接觸式虛擬按鈕設計來得太及時了!

2.嵌入式編程是否應該用C++替代C語言?

3.深度:嵌入式系統的軟體架構設計!

4.【硬核】優質 "嵌入式C編程" 必備指南

5.你的單片機裸機程序框架是怎樣的?

6.各個復位標誌解析,讓我們對MCU程序的健康更有把控

免責聲明:本文系網絡轉載,版權歸原作者所有。如涉及作品版權問題,請與我們聯繫,我們將根據您提供的版權證明材料確認版權並支付稿酬或者刪除內容。

相關焦點

  • gcc和g++有什麼區別?
    那麼,在已編輯好 C 語言或者 C++ 代碼的前提下,如何才能調用 GCC 編譯器為我們編譯程序呢?很簡單,GCC 編譯器已經為我們提供了調用它的接口,對於 C 語言或者 C++ 程序,可以通過執行 gcc 或者 g++ 指令來調用 GCC 編譯器。值得一提的是,實際使用中我們更習慣使用 gcc 指令編譯 C 語言程序,用 g++ 指令編譯 C++ 代碼。
  • gcc和g++是什麼,有什麼區別?
    那麼,在已編輯好 C 語言或者 C++ 代碼的前提下,如何才能調用 GCC 編譯器為我們編譯程序呢?很簡單,GCC 編譯器已經為我們提供了調用它的接口,對於 C 語言或者 C++ 程序,可以通過執行 gcc 或者 g++ 指令來調用 GCC 編譯器。值得一提的是,實際使用中我們更習慣使用 gcc 指令編譯 C 語言程序,用 g++ 指令編譯 C++ 代碼。
  • GCC的gcc和g++區別
    和g++是一個東西,只是有兩個不同的名字而已,今天在linux下編譯一個c代碼時出現了錯誤才找了一下gcc和g++的區別。因為以前寫程序的時候,寫的都是cpp文件,然後就直接使用g++編譯,沒出錯,也就沒有在意過這些問題,今天有一個c文件,但裡面包含後STL中的vector語法,想著使用gcc來編譯,結果報錯了,報錯是:找不到vector。
  • C語言編譯器之一,GCC
    C語言作為高級語言,用其編寫的程序指令機器並不能識別,因此需要有一個編譯器將其轉換為機器可識別的二進位指令。
  • windows系統安裝gcc編譯器----c/c++語言編譯器
    它是一個可自由使用和自由發布的Windows特定頭文件和使用GNU工具集導入庫的集合,允許你在GNU/Linux和Windows平臺生成本地的Windows程序而不需要第三方C運行時(C Runtime)庫。
  • gcc c語言編譯流程
    bianyiyuanli/test001.c:16    return 0;  400559:       b8 00 00 00 00          mov    $0x0,%eax/data/weiqifa/c/bianyiyuanli/test001.c:17}當時大家討論很激烈
  • C/C++程序編譯運行過程
    我們可以在Linux系統(我這裡用的是Ubuntu)下直接使用gcc -E main.c -o main.i命令得到預處理後的C程序main.i。我截取了一部分(總共有800+行),可以很明顯的看到:引入了頭文件,info被替換了,注釋沒了,還添加了一些特殊的標記,告訴編譯器每行的來源,以便它可以使用它們來產生合理的錯誤消息。
  • Linux GCC簡明教程(使用GCC編寫C語言程序)
    但是作為初學者,我建議大家在命令行模式下編譯C語言程序,這樣能夠了解生成一個可執行程序的詳細步驟,以及編譯命令的各種設置選項,為以後的 Linux C/C++ 開發打好堅實的基礎。本教程也毫不猶豫地使用 GCC 來編譯C語言程序。GCC 僅僅是一個編譯器,沒有界面,必須在命令行模式下使用。通過gcc命令就可以將源文件編譯成可執行文件。
  • GCC編譯基礎
    可以使用g++ -E 讓g++ 在預處理之後停止編譯過程,生成 *.ii(.c文件生成的是*.i) 文件。因為上面寫的main.cpp中沒有任何預編譯指令,所以預編譯生成與源文件幾乎沒有差別。在檢查無誤後,g++ 把代碼翻譯成彙編語言。可以使用-S 選項進行查看,該選項只進行編譯而不進行彙編,生成彙編代碼。
  • 捋一捋gcc/g++/MingW/MSVC與make/CMake的關係
    在整個大學的學習過程中,經常在各種編程環境配置中遇到諸如GNU的gcc/g++、LLVM的clang/clang++、Windows的Mingw
  • 簡要記錄丨VSCode 搭建基礎 C/C++ 編譯環境
    GBK編碼,不加這條會導致Win下輸出中文亂碼;繁體系統改成BIG515            "-std=c++14", // 要用的語言標準,根據自己的需要修改。":"$gcc" // 捕捉編譯時終端裡的報錯信息到問題面板中,修改代碼後需要重新編譯才會再次觸發29        // 本來有Lint,再開problemMatcher就有雙重報錯,但MinGW的Lint效果實在太差了;用Clang可以注釋掉30    }]31}3.4.2 C 編譯環境配置  同樣在 C 的程序文件夾下,新建一個名為 .vscode
  • C與C++混合編程
    C++調用C語言的原理是什麼?其實,C++的編譯和C語言是一樣的,都要經過四步。前四步是對文件單獨處理,而最後一步(連結)則是全員處理。混合編程的」混合「操作發生在連結這一步。c++連結時候,能夠找到對應的c語言函數的符號,那就意味著實現了混合編程。
  • GCC 程序編譯的靜態連結和動態連結
    靜態連結當連結程序時,需要使用的每個庫函數的一份拷貝被加入到可執行文件中。靜態連結使用靜態庫進行連結,生成的程序包含程序運行所需要的全部庫,可以直接運行,不過靜態連結生成的程序體積較大(即使是在靜態連結中,整個庫文件也並沒有全部裝入到可執行文件中,所裝入的只是需要的函數)。
  • 使用visual studio或msys2(mingw64)與VS Code編譯並使用openCV
    使用MinGW-W64,可以替代微軟的VC編譯器來編譯c和c++項目。MSYS2是一個集成了pacman和MinGW-w64的Cygwin升級版的工具,用於在Windows系統下提供接近原生的Linux工具鏈。通過msys2集成的pacman包管理工具,可以方便的安裝和管理包,如果你熟悉Arch Linux,使用Pacman工具會感到格外方便。
  • C++中const與C中的const使用對比
    大家好晚上好,今天給大家分享的是,c++中的const的使用,在我們以前學習c語言的時候,我們已經接觸了const的用法,那麼在c++中,const的使用,又會有什麼樣的不同呢?接下來就開始我們的分享吧!每天進步一點點,日積月累你也是專家!
  • GCC寫個庫給你玩,就這?
    ■ 「誤區一」: gcc只能編譯c代碼,g++只能編譯c++代碼。,C++的語法規則更加嚴謹一些編譯階段,g++會調用gcc, 對於C++代碼,兩者是等價的,但是因為gcc命令不能自動和C++程序使用的庫聯接,所以通常用g++來完成連結,為了統一起見,乾脆編譯/連結統統用g++了 ,這就給人一種錯覺,好像 cpp 程序只能用 g++ 似的.
  • 用Python使用C語言程序(Windows平臺)
    qianyan在機器學習中,很多時候我們需要Python和C的混合編程,最重要的原因是為了性能效率的提升: 解釋型語言一般比編譯型語言慢,一般提高性能的有效做法是,先做性能測試,找出性能瓶頸部分,然後把瓶頸部分在擴展中實現。本文的目標是在windows平臺下(使用pycharm),實現python調用C語言編寫的程序。
  • 經典實用技術文:GCC如何內嵌彙編指令?
    比如我最近在ARM上寫FIR程序時,需要對最後的結果進行飽和處理,但gcc沒有提供ssat這樣的函數,於是不得不在C代碼中嵌入彙編指令。在C語言中如何使用彙編語言呢?這個問題在 不同的編譯器中,具體實現方法是不同的。不過在實現大方上也不過就是有兩種,而且各種編譯器的實現方法也是大同小異。一種是在C語言中嵌入彙編語言代碼, 另一種是讓C語言從外部調用彙編。
  • 【C語言系列】C語言編譯流程分析
    \n」); return 0;}通常我們使用gcc來生成可執行程序,命令為:gcc hello.c,默認生成可執行文件a.out其實編譯(包括連結)的命令:gcc hello.c 可分解為如下4個大的步驟:預處理(Preprocessing)編譯(Compilation
  • Linux c編程起步,掌握gcc的基本用法
    3.gcc選項總體選項 (Overall Option) :(-c(生成目標但不連接) -S(彙編) -E(預處理) -o file(生成指定的文件) -pipe -v(顯示過程) -x language (設定文件所使用的語言,使後綴名無效`c』, 可用參數`objective-c』, `c-header』, `c++』, `cpp-output