<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          gcc和g++是什么,有什么區(qū)別?

          共 4042字,需瀏覽 9分鐘

           ·

          2021-04-19 10:18


          點(diǎn)擊上方小白學(xué)視覺(jué)”,選擇加"星標(biāo)"或“置頂

          重磅干貨,第一時(shí)間送達(dá)

          機(jī)器算法學(xué)習(xí)那些事

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


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


          那么,在已編輯好 C 語(yǔ)言或者 C++ 代碼的前提下,如何才能調(diào)用 GCC 編譯器為我們編譯程序呢?很簡(jiǎn)單,GCC 編譯器已經(jīng)為我們提供了調(diào)用它的接口,對(duì)于 C 語(yǔ)言或者 C++ 程序,可以通過(guò)執(zhí)行 gcc 或者 g++ 指令來(lái)調(diào)用 GCC 編譯器。

          值得一提的是,實(shí)際使用中我們更習(xí)慣使用 gcc 指令編譯 C 語(yǔ)言程序,用 g++ 指令編譯 C++ 代碼。需要強(qiáng)調(diào)的一點(diǎn)是,這并不是 gcc 和 g++ 的區(qū)別,gcc 指令也可以用來(lái)編譯 C++ 程序,同樣 g++ 指令也可以用于編譯 C 語(yǔ)言程序。

          那么,gcc 和 g++ 的區(qū)別是什么呢?接下來(lái)就給讀者做詳細(xì)的講解。

          實(shí)際上,只要是 GCC 支持編譯的程序代碼,都可以使用 gcc 命令完成編譯。可以這樣理解,gcc 是 GCC 編譯器的通用編譯指令,因?yàn)楦鶕?jù)程序文件的后綴名,gcc 指令可以自行判斷出當(dāng)前程序所用編程語(yǔ)言的類別,比如:

          • xxx.c:默認(rèn)以編譯 C 語(yǔ)言程序的方式編譯此文件;

          • xxx.cpp:默認(rèn)以編譯 C++ 程序的方式編譯此文件。

          • xxx.m:默認(rèn)以編譯 Objective-C 程序的方式編譯此文件;

          • xxx.go:默認(rèn)以編譯 Go 語(yǔ)言程序的方式編譯此文件;

          當(dāng)然,gcc 指令也為用戶提供了“手動(dòng)指定代表編譯方式”的接口,即使用 -x 選項(xiàng)。例如,gcc -xc xxx 表示以編譯 C 語(yǔ)言代碼的方式編譯 xxx 文件;而 gcc -xc++ xxx 則表示以編譯 C++ 代碼的方式編譯 xxx 文件。有關(guān) -x 選項(xiàng)的用法,后續(xù)會(huì)給出具體樣例。

          但如果使用 g++ 指令,則無(wú)論目標(biāo)文件的后綴名是什么,該指令都一律按照編譯 C++ 代碼的方式編譯該文件。也就是說(shuō),對(duì)于 .c 文件來(lái)說(shuō),gcc 指令以 C 語(yǔ)言代碼對(duì)待,而 g++ 指令會(huì)以 C++ 代碼對(duì)待。但對(duì)于 .cpp 文件來(lái)說(shuō),gcc 和 g++ 都會(huì)以 C++ 代碼的方式編譯。

          有讀者可能會(huì)認(rèn)為,C++ 兼容 C 語(yǔ)言,因此對(duì)于 C 語(yǔ)言程序來(lái)說(shuō),使用 gcc 編譯還是使用 g++ 編譯,應(yīng)該沒(méi)有什么區(qū)別,事實(shí)并非如此。嚴(yán)格來(lái)說(shuō),C++ 標(biāo)準(zhǔn)和 C 語(yǔ)言標(biāo)準(zhǔn)的語(yǔ)法要求是有區(qū)別的。舉個(gè)例子:

          //位于 demo.c 文件中#include <stdio.h>int main(){    const char * a = "abc";    printStr(a);    return;}int printStr(const char* str){    printf(str);}


          如上所示,這是一段不規(guī)范的 C 語(yǔ)言代碼。如果我們使用 gcc 指令編譯,如下所示:

          [root@bogon ~]# gcc -xc demo.c   #或者直接運(yùn)行 gcc demo.c
          [root@bogon ~]#


          可以看到,該指令的執(zhí)行過(guò)程并沒(méi)有發(fā)生任何錯(cuò)誤。而同樣的程序,如果我們使用 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 編譯器發(fā)現(xiàn)了 3 處錯(cuò)誤。顯然,C++ 標(biāo)準(zhǔn)對(duì)代碼書(shū)寫(xiě)規(guī)范的要求更加嚴(yán)格。

          除此之外對(duì)于編譯執(zhí)行 C++ 程序,使用 gcc 和 g++ 也是有區(qū)別的。要知道,很多 C++ 程序都會(huì)調(diào)用某些標(biāo)準(zhǔn)庫(kù)中現(xiàn)有的函數(shù)或者類對(duì)象,而單純的 gcc 命令是無(wú)法自動(dòng)鏈接這些標(biāo)準(zhǔn)庫(kù)文件的。舉個(gè)例子:

          //demo.cpp#include <iostream>#include <string>using namespace std;int main(){    string str ="C語(yǔ)言中文網(wǎng)";    cout << str << endl;    return 0;}

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

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

          可以看到,整個(gè)編譯過(guò)程沒(méi)有報(bào)任何錯(cuò)誤。但如果使用 gcc 指令:

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

          讀者可自行編譯,就可以看到很多報(bào)錯(cuò)信息。其根本原因就在于,該程序中使用了標(biāo)準(zhǔn)庫(kù) <iostream> 和<string> 提供的類對(duì)象,而 gcc 默認(rèn)是無(wú)法找到它們的。

          如果想使用 gcc 指令來(lái)編譯執(zhí)行 C++ 程序,需要在使用 gcc 指令時(shí),手動(dòng)為其添加 -lstdc++ -shared-libgcc 選項(xiàng),表示 gcc 在編譯 C++ 程序時(shí)可以鏈接必要的 C++ 標(biāo)準(zhǔn)庫(kù)。也就是說(shuō),我們可以這樣編譯 demo.cpp 文件:

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

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

          讀者可以這樣認(rèn)為,g++ 指令就等同于gcc -xc++ -lstdc++ -shared-libgcc指令。顯然后者書(shū)寫(xiě)是非常麻煩的,大多數(shù)人會(huì)更喜歡前者。

          對(duì)于 gcc 和 g++ 指令,還有其它更多細(xì)節(jié)方面的區(qū)別,這里不再做更多的贅述。讀完本節(jié),讀者只需要知道,對(duì)于 C 語(yǔ)言程序的編譯,我們應(yīng)該使用 gcc 指令,而編譯 C++ 程序則推薦使用 g++ 指令,這就足夠了。


          下載1:OpenCV-Contrib擴(kuò)展模塊中文版教程
          在「小白學(xué)視覺(jué)」公眾號(hào)后臺(tái)回復(fù):擴(kuò)展模塊中文教程即可下載全網(wǎng)第一份OpenCV擴(kuò)展模塊教程中文版,涵蓋擴(kuò)展模塊安裝、SFM算法、立體視覺(jué)、目標(biāo)跟蹤、生物視覺(jué)、超分辨率處理等二十多章內(nèi)容。

          下載2:Python視覺(jué)實(shí)戰(zhàn)項(xiàng)目52講
          小白學(xué)視覺(jué)公眾號(hào)后臺(tái)回復(fù):Python視覺(jué)實(shí)戰(zhàn)項(xiàng)目即可下載包括圖像分割、口罩檢測(cè)、車道線檢測(cè)、車輛計(jì)數(shù)、添加眼線、車牌識(shí)別、字符識(shí)別、情緒檢測(cè)、文本內(nèi)容提取、面部識(shí)別等31個(gè)視覺(jué)實(shí)戰(zhàn)項(xiàng)目,助力快速學(xué)校計(jì)算機(jī)視覺(jué)。

          下載3:OpenCV實(shí)戰(zhàn)項(xiàng)目20講
          小白學(xué)視覺(jué)公眾號(hào)后臺(tái)回復(fù):OpenCV實(shí)戰(zhàn)項(xiàng)目20講即可下載含有20個(gè)基于OpenCV實(shí)現(xiàn)20個(gè)實(shí)戰(zhàn)項(xiàng)目,實(shí)現(xiàn)OpenCV學(xué)習(xí)進(jìn)階。

          交流群


          歡迎加入公眾號(hào)讀者群一起和同行交流,目前有SLAM、三維視覺(jué)、傳感器自動(dòng)駕駛、計(jì)算攝影、檢測(cè)、分割、識(shí)別、醫(yī)學(xué)影像、GAN算法競(jìng)賽等微信群(以后會(huì)逐漸細(xì)分),請(qǐng)掃描下面微信號(hào)加群,備注:”昵稱+學(xué)校/公司+研究方向“,例如:”張三 + 上海交大 + 視覺(jué)SLAM“。請(qǐng)按照格式備注,否則不予通過(guò)。添加成功后會(huì)根據(jù)研究方向邀請(qǐng)進(jìn)入相關(guān)微信群。請(qǐng)勿在群內(nèi)發(fā)送廣告,否則會(huì)請(qǐng)出群,謝謝理解~


          瀏覽 31
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          CRM和SCRM有什么區(qū)別?
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  女人18水真多毛片一级A片 | 久久精品视频观看 | 视频三区在线播放 | 色小哥 | 欧美另类色图 |