導航:首頁 > 源碼編譯 > gcc只運行不編譯

gcc只運行不編譯

發布時間:2025-01-09 23:17:08

1. gcc和g++的區別

誤區一:gcc只能編譯c代碼,g++只能編譯c++代碼
兩者都可以,但是請注意:
1.後綴為.c的,gcc把它當作是C程序,而g++當作是c++程序;後綴為.cpp的,兩者都會認為是c++程序,注意,雖然c++是c的超集,但是兩者對語法的要求是有區別的。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,二者等價。

gcc和g++的區別


們在編譯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++命名有什麼不同

[root@root G++]# g++ -S me.cpp
[root@root G++]# less me.s
.globl _Z9CppPrintfv //注意此函數的命名
.type CppPrintf, @function
[root@root GCC]# gcc -S me.cpp
[root@root GCC]# less me.s
.globl _Z9CppPrintfv //注意此函數的命名
.type CppPrintf, @function
完全相同!

2. 去掉me.h中extern "C",看用gcc和g++命名有什麼不同
[root@root GCC]# gcc -S me.cpp
[root@root GCC]# less me.s
.globl _Z9CppPrintfv //注意此函數的命名
.type _Z9CppPrintfv, @function
[root@root G++]# g++ -S me.cpp
[root@root G++]# less me.s
.globl _Z9CppPrintfv //注意此函數的命名
.type _Z9CppPrintfv, @function
完全相同!
【結論】完全相同,可見extern "C"與採用gcc/g++並無關系,以上的試驗還間接的印證了前面的說法:在編譯階段,g++是調用gcc的。

2. gcc是什麼意思

GCC(GNU Compiler Collection,GNU編譯器套件),是由 GNU 開發的編程語言編譯器。它是以GPL許可證所發行的自由軟體,也是 GNU計劃的關鍵部分。

GCC原本作為GNU操作系統的官方編譯器,現已被大多數類Unix操作系統(如Linux、BSD、Mac OS X等)採納為標準的編譯器,GCC同樣適用於微軟的Windows。GCC是自由軟體過程發展中的著名例子,由自由軟體基金會以GPL協議發布。

GCC功能與作用:

1、預處理

命令gcc首先調用cpp進行預處理,在預處理過程中,對源代碼文件中的文件包含(include)、預編譯語句(如宏定義define等)進行分析。

2、編譯

用GCC編譯C/C++代碼時,它會試著用最少的時間完成編譯並且編譯後的代碼易於調試。易於調試意味著編譯後的代碼與源代碼有同樣的執行順序,編譯後的代碼沒有經過優化。

3、連接

當所有的目標文件都生成之後,gcc就調用ld來完成最後的關鍵性工作,這個階段就是連接。在連接階段,所有的目標文件被安排在可執行程序中的恰當的位置,同時,該程序所調用到的庫函數也從各自所在的檔案庫中連到合適的地方。

4、匯編

匯編過程是針對匯編語言的步驟,調用as進行工作,一般來講,.S為後綴的匯編語言源代碼文件和匯編、.s為後綴的匯編語言文件經過預編譯和匯編之後都生成以.o為後綴的目標文件。

GCC在執行編譯工作的時候,總共需要4步:

1、預處理,生成 .i 的文件[預處理器cpp]

2、將預處理後的文件轉換成匯編語言, 生成文件 .s [編譯器egcs]

3、有匯編變為目標代碼(機器代碼)生成 .o 的文件[匯編器as]

4、連接目標代碼, 生成可執行程序 [鏈接器ld]

常用選項

-ansi 只支持 ANSI 標準的 C 語法。這一選項將禁止 GNU C 的某些特色, 例如 asm 或 typeof 關鍵詞。

1、-c:只編譯並生成目標文件。

2、-DMACRO:以字元串"1"定義 MACRO 宏。

3、-DMACRO=DEFN:以字元串"DEFN"定義 MACRO 宏。

4、-E:只運行 C 預編譯器。

5、-g:生成調試信息。GNU 調試器可利用該信息。

6、-IDIRECTORY:指定額外的頭文件搜索路徑DIRECTORY。

7、-LDIRECTORY:指定額外的函數庫搜索路徑DIRECTORY。

8、-lLIBRARY:連接時搜索指定的函數庫LIBRARY。

9、-m486:針對 486 進行代碼優化。

3. gcc編譯問題

gcc編譯失敗的可能原因及解決方案


一、原因及解決方案概述


在使用gcc進行編譯時,可能會遇到多種問題。常見的問題包括語法錯誤、鏈接錯誤、庫文件缺失等。針對這些問題,我們需要仔細檢查源代碼、編譯命令以及環境配置,確保無誤後才能成功編譯。


二、詳細解釋


1. 語法錯誤:這是編譯器在解析源代碼時最常見的問題。可能是由於使用了錯誤的語法、關鍵字使用不當、括弧不匹配等原因造成。這種情況下,gcc會給出具體的錯誤提示,根據提示檢查並修改源代碼即可。


2. 鏈接錯誤:在編譯過程中,鏈接器可能會找不到之前定義的函數或變數。這通常是因為函數或變數的聲明與定義不匹配,或者文件路徑設置不正確等。解決這類問題需要檢查函數和變數的聲明和定義是否一致,並確保所有依賴的文件都被正確包含。


3. 庫文件缺失:某些程序需要依賴特定的庫文件才能編譯成功。如果缺少這些庫文件,gcc會報錯。解決這類問題通常需要安裝缺失的庫文件,或者通過編譯選項指定庫文件的路徑。


三、解決方案實施建議


針對以上問題,我們可以採取以下措施:


1. 仔細閱讀錯誤提示:gcc的錯誤提示非常詳細,包含了錯誤類型和具體位置,這是解決問題的關鍵。


2. 檢查源代碼:根據錯誤提示檢查源代碼,特別是錯誤發生的位置附近,看是否存在語法錯誤、變數聲明與定義不匹配等問題。


3. 確認庫文件:確保所有依賴的庫文件都已正確安裝,並且路徑設置正確。


4. 使用正確的編譯命令:確保編譯命令包含了所有必要的文件和選項。


四、總結


解決gcc編譯問題需要我們仔細分析和理解錯誤提示,檢查源代碼和環境配置,確保一切正確後再進行編譯。遇到問題不要慌張,逐一排查,往往能很快找到解決方案。

閱讀全文

與gcc只運行不編譯相關的資料

熱點內容
天狐app怎麼樣 瀏覽:891
程序員佛系頭像 瀏覽:703
貓架app是干什麼的 瀏覽:513
建行app怎麼繳社保 瀏覽:99
flooding演算法 瀏覽:414
福州地區吃飯用什麼app 瀏覽:952
榮耀大文件夾名稱大全 瀏覽:980
空白文件夾集中 瀏覽:16
php查看瀏覽器版本 瀏覽:636
怎麼用搜索引擎搜奧運會伺服器 瀏覽:210
蘋果手機使用軟體怎麼伺服器繁忙 瀏覽:586
長河全文在什麼app可以看 瀏覽:597
廣東dns伺服器雲伺服器 瀏覽:45
java等待喚醒 瀏覽:754
app系統中已鎖定什麼時候 瀏覽:328
qq在後台顯示加密 瀏覽:178
如何訓練演算法 瀏覽:462
ios查看壓縮文件 瀏覽:659
移除的app怎麼找回桌面 瀏覽:859
低級語言編譯器 瀏覽:30