1. 程式人生 > >gcc g++ c++ mingw32-c++.exe mingw32-g++.exe mingw32-gcc.exe之間的關係

gcc g++ c++ mingw32-c++.exe mingw32-g++.exe mingw32-gcc.exe之間的關係

我們在編譯c/c++程式碼的時候,有人用gcc,有人用g++,於是各種說法都來了,譬如c程式碼用gcc,而c++程式碼用g++,或者說編譯用 gcc,連結用g++,一時也不知哪個說法正確,如果再遇上個extern "C",分歧就更多了,這裡我想作個了結,畢竟知識的目的是令人更清醒,而不是更糊塗。 誤區一:gcc只能編譯c程式碼,g++只能編譯c++程式碼
兩者都可以,但是請注意: 1.字尾為.c的,gcc把它當作是C程式,而g++當作是c++程式;字尾為.cpp的,兩者都會認為是c++程式,注意,雖然c++是c的超集,但是兩者對語法的要求是有區別的,例如: #include <stdio.h> int main(int argc, char* argv[]) {
   if(argv == 0) return;    printString(argv
);    return;
}
int printString(char* string) {
  sprintf(string, "This is a test./n");
}
如果按照C的語法規則,OK,沒問題,但是,一旦把字尾改為cpp,立刻報三個錯:“printString未定義”; “cannot convert `char**' to `char*”; ”return-statement with no value“; 分別對應前面紅色標註的部分。可見C++的語法規則更加嚴謹一些。 2.編譯階段,g++會呼叫gcc,對於c++程式碼,兩者是等價的,但是因為gcc命令不能自動和C++程式使用的庫聯接,所以通常用g++來完成連結,為了統一起見,乾脆編譯/連結統統用g++了,這就給人一種錯覺,好像cpp程式只能用g++似的。 誤區二:gcc不會定義__cplusplus巨集,而g++會

實際上,這個巨集只是標誌著編譯器將會把程式碼按C還是C++語法來解釋,如上所述,如果字尾為.c,並且採用gcc編譯器,則該巨集就是未定義的,否則,就是已定義。 誤區三:編譯只能用gcc,連結只能用g++ 嚴格來說,這句話不算錯誤,但是它混淆了概念,應該這樣說:編譯可以用gcc/g++,而連結可以用g++或者gcc -lstdc++。因為gcc命令不能自動和C++程式使用的庫聯接,所以通常使用g++來完成聯接。但在編譯階段,g++會自動呼叫gcc,二者等價。 誤區四:extern "C"與gcc/g++有關係

實際上並無關係,無論是gcc還是g++,用extern "c"時,都是以C的命名方式來為symbol命名,否則,都以c++方式命名。試驗如下:
me.h
extern "C" void CppPrintf(void); me.cpp:
#include <iostream>
#include "me.h"
using namespace std;
void CppPrintf(void)
{
     cout << "Hello/n";
} test.cpp:
#include <stdlib.h>
#include <stdio.h>
#include "me.h"        
int main(void)
{
    CppPrintf();
    return 0;
} 1. 先給me.h加上extern "C",看用gcc和g++命名有什麼不同
[[email protected] G++]# g++ -S me.cpp
[[email protected] G++]# less me.s
.globl _Z9CppPrintfv        //注意此函式的命名
        .type   CppPrintf, @function [[email protected] GCC]# gcc -S me.cpp
[[email protected] GCC]# less me.s
.globl _Z9CppPrintfv        //注意此函式的命名
        .type   CppPrintf, @function
完全相同!
               
2. 去掉me.h中extern "C",看用gcc和g++命名有什麼不同 [[email protected] GCC]# gcc -S me.cpp
[[email protected] GCC]# less me.s
.globl _Z9CppPrintfv        //注意此函式的命名
        .type   _Z9CppPrintfv, @function [[email protected] G++]# g++ -S me.cpp
[[email protected] G++]# less me.s
.globl _Z9CppPrintfv        //注意此函式的命名
        .type   _Z9CppPrintfv, @function
完全相同! 【結論】完全相同,可見extern "C"與採用gcc/g++並無關係,以上的試驗還間接的印證了前面的說法:在編譯階段,g++是呼叫gcc的。

相關推薦

gcc g++ c++ mingw32-c++.exe mingw32-g++.exe mingw32-gcc.exe之間關係

我們在編譯c/c++程式碼的時候,有人用gcc,有人用g++,於是各種說法都來了,譬如c程式碼用gcc,而c++程式碼用g++,或者說編譯用 gcc,連結用g++,一時也不知哪個說法正確,如果再遇上個extern "C",分歧就更多了,這裡我想作個了結,畢竟知

gcc g++支持C++11 標準編譯及其區別

包含 別名 glob sin 你會 con 並且 c++程序 轉換成 g++ -g -Wall -std=c++11 main.cpp gcc -g -Wall -std=c11 main.cpp 如果不想每次寫這個-std=C++11這個選項該怎麽辦呢?   方法出

gccg++編譯c或者c++檔案碰到的問題

gcc和g++都是GNU(組織)的一個編譯器。             誤區一:gcc只能編譯c程式碼,g++只能編譯c++程式碼       兩者都可以,但是請注意:  

gccg++ 下 CC++ 檔案編譯過程

文章目錄 一、檔案字尾名含義 二、編譯步驟 三、每個編譯步驟對應的編譯選項 四、參考資料 一、檔案字尾名含義 字尾名 語言種類 後期操作

windows(8) 下在GVIM中使用gcc/g++編譯除錯c/cpp檔案

1. 首先下載安裝MinGW,下載地址: http://sourceforge.net/projects/mingw/。這個是邊下載邊安裝的,下載完成即安裝完成。我的安裝目錄為D:\MinGW; 2. 設定系統環境變數。右擊Computer -> Properties

G a+b+c+d=?

G a+b+c+d=? 連結:https://ac.nowcoder.com/acm/contest/338/G來源:牛客網 題目描述 This is a very simple problem! Your only job is to c

湖南大學第十四屆ACM程式設計大賽 G a+b+c+d=?

連結:https://ac.nowcoder.com/acm/contest/338/G 來源:牛客網 時間限制:C/C++ 1秒,其他語言2秒 空間限制:C/C++ 32768K,其他語言65536K 64bit IO Format: %lld 題目描述 This is a very

POJ 1064 Cable master (二分答案,G++不過,C++就過了)

題目: 這題有點坑,G++過不了,C++能過。 條件:n個數據a[],分成k段,結果精度要求兩位小數。 問題:每段最長為多少? 思路:因為精度要求為兩位小數,我先把所有的長度a[]*100。    我們對答案二分搜尋,把l設定為0,r設定為1000

簡談用g++編譯執行c++程式碼流程,以及動態庫靜態庫的建立與使用

一 g++ 編譯執行hello world 1編寫hello world 程式碼 #include<iostream> using namespace std; int main() { cout << "hello

g++ 編譯連結C++程式碼, 生成與使用靜態庫和動態庫

例如我有A.cpp、A.h、main.cpp 三個檔案 編譯連結C++程式碼: 第一步:g++ -c A.cpp main.cpp 這樣就可以編譯A.cpp和main.cpp的程式碼生成A.o和main.o檔案【因為A.cpp包含了A.h的標頭檔案,所以一般編譯時

g++編譯連結c語言檔案報錯“undefined reference ” 的處理

用QT寫一介面程式,其中用到另一同事寫的一個小功能,他是用c語言寫的,於是把他的程式碼標頭檔案和原始檔都copy過來了,加入工程中,結果連結的時候就總報錯 undefined reference 某個函式。再三確認了makefile檔案和原始碼,表示沒問題,後來想到或許是g+

已知有列舉型別定義:enum MyEn{a=101,b,c=207,d,e,f,g},程式設計輸出第5個列舉元素的序號值

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace _2._3._2 {     enum MyEn { a = 101, b, c

linux下使用gcc編譯運行C程序

images 鏈接 cnblogs bin collect 運行 ffffff alt 兩種 gcc(GNU Compiler Collection)是Linux下最常用的C語言編譯器,是GNU項目中符合ANSI C標準的編譯系統,能夠編譯用C、C++和Object C等語

gcc -o hello hello.c 執行過程

不同 單獨 內容 擴展名 c編譯器 方式 文本格式 c程序 打包 GCC編譯器驅動程序讀取源程序文件hello.c,並將它翻譯成一個可執行目標文件hello。這個翻譯的過程可分為四個階段。 1.預處理階段 預處理器(cpp)根據以字符#開頭的命令,修改原始的c程序。比如he

C#中怎麽用process調用一個exe文件並傳入參數?

[1] s參數 div tex 入參 orm ring gpo 轉換 System.Diagnostics.Process.Start("程序的路徑", "參數1 參數2");第一個參數是aaa.exe 的路徑,第二個參數是用空格分開的兩個參數組成的字符串。aaa.exe中

C-Free 5 加 TDM-GCC編輯器搭建C/C++開發環境

本文所需要的安裝程式下載地址:https://download.csdn.net/download/fangfang635344731/10705407 1.安裝C-Free 5,這一步重點是安裝路徑絕對不能有空格!!!我的安裝路徑為“C:\C-Free5”。 2.安裝TDM-GCC,我用的

Spring整合JUnit4進行AOP單元測試的時候,報:"C:\Program Files\Java\jdk1.8.0_191\bin\java.exe" -ea -Didea.test.cyclic.buffer.size=1048576 "-javaagent:C

錯誤程式碼 "C:\Program Files\Java\jdk1.8.0_191\bin\java.exe" -ea -Didea.test.cyclic.buffer.size=1048576 "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA

[轉載]Visual Studio, GCC, Clang, Intel 對 C++11 特性的支援一覽表

參與翻譯(3人):throwable, jimmyjmh, Khiyuan距離我上次對C++11支援的不同編譯器的比較已經有大半年了。這次我來根據這些預覽版的編譯器的文件來看下它們是如何堆砌起來的。GCC的下個版本是4.8,以及Clang即將到來的版本是3.3 。如果你使用Visual Studio 2012

CentOS上升級gcc編譯器使支援C++11

首先向博主致敬,好的東西拿來共享了,用一下不錯。 https://blog.csdn.net/clirus/article/details/62424517   0. 目標  最近在學習c++11,我本機裝的CentOS編譯器較老,不支援C++11的新特性,所以我需要把g

C# 基礎(十三)C# 軟體開發過程中,可執行檔案.exe 出現bug,該怎麼排查、解決:找到出現bug的位置

一、簡介 之前是完成了寫軟體,從而實現軟體的基本功能。到了今天,需要對自己寫的可執行檔案.exe找bug了。那麼下面,我將結合自己的軟體的使用過程中,講自己的經驗融入進來,解釋下什麼是bug、以及該怎麼找Bug。 二、Bug的分類 主要參考: https://blog.csdn.ne