當前位置:首頁 » 編程軟體 » 編譯器o

編譯器o

發布時間: 2022-12-27 13:26:05

1. c語言編譯器如何運行

編譯共分為四個階段:預處理階段、編譯階段、匯編階段、鏈接階段。

1、預處理階段:

主要工作是將頭文件插入到所寫的代碼中,生成擴展名為「.i」的文件替換原來的擴展名為「.c」的文件,但是原來的文件仍然保留,只是執行過程中的實際文件發生了改變。(這里所說的替換並不是指原來的文件被刪除)

2、匯編階段:

插入匯編語言程序,將代碼翻譯成匯編語言。編譯器首先要檢查代碼的規范性、是否有語法錯誤等,以確定代碼的實際要做的工作,在檢查無誤後,編譯器把代碼翻譯成匯編語言,同時將擴展名為「.i」的文件翻譯成擴展名為「.s」的文件。

3、編譯階段:

將匯編語言翻譯成機器語言指令,並將指令打包封存成可重定位目標程序的格式,將擴展名為「.s」的文件翻譯成擴展名為「.o」的二進制文件。

4、鏈接階段:

在示例代碼中,改代碼文件調用了標准庫中printf函數。而printf函數的實際存儲位置是一個單獨編譯的目標文件(編譯的結果也是擴展名為「.o」的文件),所以此時主函數調用的時候,需要將該文件(即printf函數所在的編譯文件)與hello world文件整合到一起,此時鏈接器就可以大顯神通了,將兩個文件合並後生成一個可執行目標文件。

2. linux 如何使用GCC編譯器將一個文件夾下的100個.o文件打包成一個靜態庫文件(.a)

你已經用gcc編譯出目標文件了,用ar工具打包成.a文件就行了啊,示例:


如上圖,假設我有test1.c,test2.c兩個源文件,先使用gcc -c *.c將源文件編譯成目標文件,可以看到,生成了test1.o,test2.o兩個目標文件,然後,使用ar命令:ar crv libtest.a *.o將該目錄下的所有目標文件打包生成了libtest.a文件。這樣,你在編譯的時候就可以直接使用這個靜態庫了。

3. C語言代碼怎麼編譯成.o文件再怎麼變成.exe文件

linux下gcc -c wen.c -o wen.o 生成.o文件gcc wen.o -o wen 就變成.exe文件

4. C語言代碼怎麼編譯成.o文件再怎麼變成.exe文件

簡單的說,由編譯器做一些工作,把c語言轉換成機器可以識別的機器語言(.exe)
一般把.c到.o稱之為編譯,.o到.exe稱之為連接
編譯+連接整個過程的統稱也叫編譯

具體的過程,你可以認為是翻譯,如果真的很感興趣,學一下編譯原理也可以。

我想我在這說一堆詞法分析 語法分析 語義分析什麼的 估計你也不會感興趣的

5. gcc-c和-o有什麼區別

-c和-o都是gcc編譯器的可選參數。

-c表示只編譯(compile)源文件但不鏈接,會把.c或.cc的c源程序編譯成目標文件,一般是.o文件。-o用於指定輸出(out)文件名。不用-o的話,一般會在當前文件夾下生成默認的a.out文件作為可執行程序。

例如:

gcc -c test.c將生成test.o的目標文件

gcc -o app test.c將生成可執行程序app

gcc -c a.c -o a.o表示把源文件a.c編譯成指定文件名a.o的中間目標文件(其實在這里,把-o a.o省掉,效果是一樣的,因為中間文件默認與源文件同名,只是後綴變化)。

1、如果GCC不帶-C參數,編譯一個源代碼文件(test.c)。那麼會自動將編譯和鏈接一步完成,並生成可執行文件。可執行文件可以有-o參數指定(test.o)

2、如果是多個文件,則需要先編譯成中間目標文件(一般是.o文件),在鏈接成可執行文件,一般習慣目標文件都是以.o後綴,也沒有硬性規定可執行文件不能用.o文件。

(5)編譯器o擴展閱讀:

gcc:GNU編譯器套件(GNU Compiler Collection)包括C、C++、Objective-C、Fortran、Java、Ada和Go語言的前端,也包括了這些語言的庫(如libstdc++、libgcj等等)。GCC的初衷是為GNU操作系統專門編寫的一款編譯器。GNU系統是徹底的自由軟體。此處,「自由」的含義是它尊重用戶的自由。

基本用法:

-o output_filename,確定輸出文件的名稱為output_filename,同時這個名稱不能和源文件同名。如果不給出這個選項,gcc就給出預設的可執行文件a.out。

-O,對程序進行優化編譯、鏈接,採用這個選項,整個源代碼會在編譯、鏈接過程中進行優化處理,這樣產生的可執行文件的執行效率可以提高,但是,編譯、鏈接的速度就相應地要慢一些。

6. gcc編譯器幾乎很難發現c語言中的語法錯誤嗎

1、使用gcc命令編譯c++程序遇到錯誤。
需要明確的是,gcc是可以編譯c++程序的。gcc,原名GNU C Compiler,最初是C語言的編譯器,但經過發展之後,它變成了一個可以支持C++、Fortran、Pascal、Objective-C、Java、Ada,以及Go與其他語言編譯的編譯器套件,其名稱也因此改為了GNU Compiler Collection。g++便是其中的一部分,用於處理c++語言。雖然大多數情況下,我們直接使用g++命令來編譯c++程序,但直接使用gcc命令也可以編譯c++程序的,當然前提是安裝了g++(gcc-c++)模塊。gcc命令會根據源程序的後綴名來決定實際使用的編譯器,編譯過程與直接使用g++完全一樣,但是,鏈接過程有點不同。g++命令會自動給你加上c++標准庫的鏈接,但gcc命令卻不會給你自動加上,因些需要手動加上。例如如下的程序:

#include <iostream>

int main()
{
std::cout << "Hello World!" << std::endl;
return 0;
}
使用gcc命令編譯會報undefined reference的錯誤,使用g++命令就不會,但是使用gcc命令加上stdc++的鏈接庫就可以成功編譯。所以,如果是編譯c++程序,最好還是使用g++命令編譯吧。

2、undefined reference to XXX的問題

這個問題應該說是非常常見的一個問題了,通常情況下,這個問題是由於你使用了第三方的庫文件,卻沒有加上相應的庫的鏈接,導致編譯器找不到符號。這種情況也比較好解決,只要加上鏈接庫就可以了,具體命令有兩種寫法,一是使用-L和-l參數指定庫的路徑和庫名,其中,庫的文件名必須為libxxx.so或者libxxx.a的形式,其中的xxx就是庫名,跟在-l參數後面;第二種是直接寫上庫的文件名(相對路徑、絕對路徑都可以),這種寫些就是直接當這個庫文件是一個.o文件(目標文件)進行鏈接。

不過有時候,明明已經寫上了鏈接庫,可還是會有undefined reference的錯誤,這個候,可能就是鏈接順序的問題了。同樣是上述簡單的hello.cpp,我們使用gcc命令編譯(不用g++命令是因為它自動加了stdc++的鏈接庫,我們不好改順序)

可以看到,雖然加上了-lstdc++,但還是有undefined reference的錯誤。這是因為鏈接器在進行鏈接的時候,是從前往後找符號的。由於libstdc++.so庫中的的符號(std::cout,std::endl)是在hello.o(由hello.cpp編譯而來)中使用的,因此,當鏈接器從左至右拋描庫文件時,第一個碰到了stdc++庫,發現並沒有使用這個庫中的符號,於是就將這個庫給丟棄不用了,繼續往後鏈接hello.o的時候,發現了其中要使用一些符號,而這些符號是stdc++中的,而stdc++庫已經被鏈接器給扔了,所以就找不著了,就有了undefined reference。解決的方案也是兩個:一是按引用順序寫鏈接的目標文件的順序,如果是編譯可執行程序,就從包含main函數的.o文件開始寫,最基礎的庫寫在最右邊;二是加上-Wl,--as-needed參數,這個參數會將庫文件中加入NEED標識,而不管這個庫文件有沒有用到(也就是告訴鏈接器,那個暫時沒用到的庫先別扔了)。但是第二種方法好像對stdc++這個庫沒什麼作用,其他的第三方庫可以,具體原因是什麼還不太清楚,所以,最好寫編譯選項的時候,庫文件還是按引用順序寫吧。

7. 什麼是GCC編譯器

Linux系統下的Gcc(GNU C Compiler)是GNU推出的功能強大、性能優越的多平台編譯器,是GNU的代表作品之一。gcc是可以在多種硬體平台上編譯出可執行程序的超級編譯器,其執行效率與一般的編譯器相比平均效率要高20%~30%。 Gcc編譯器能將C、C++語言源程序、匯程式化序和目標程序編譯、連接成可執行文件,如果沒有給出可執行文件的名字,gcc將生成一個名為a.out的文件。在Linux系統中,可執行文件沒有統一的後綴,系統從文件的屬性來區分可執行文件和不可執行文件。而gcc則通過後綴來區別輸入文件的類別,下面我們來介紹gcc所遵循的部分約定規則。 .c為後綴的文件,C語言源代碼文件; .a為後綴的文件,是由目標文件構成的檔案庫文件; .C,.cc或.cxx 為後綴的文件,是C++源代碼文件; .h為後綴的文件,是程序所包含的頭文件; .i 為後綴的文件,是已經預處理過的C源代碼文件; .ii為後綴的文件,是已經預處理過的C++源代碼文件; .m為後綴的文件,是Objective-C源代碼文件; .o為後綴的文件,是編譯後的目標文件; .s為後綴的文件,是匯編語言源代碼文件; .S為後綴的文件,是經過預編譯的匯編語言源代碼文件。 Gcc的執行過程 雖然我們稱Gcc是C語言的編譯器,但使用gcc由C語言源代碼文件生成可執行文件的過程不僅僅是編譯的過程,而是要經歷四個相互關聯的步驟∶預處理(也稱預編譯,Preprocessing)、編譯(Compilation)、匯編(Assembly)和連接(Linking)。 命令gcc首先調用cpp進行預處理,在預處理過程中,對源代碼文件中的文件包含(include)、預編譯語句(如宏定義define等)進行分析。接著調用cc1進行編譯,這個階段根據輸入文件生成以.o為後綴的目標文件。匯編過程是針對匯編語言的步驟,調用as進行工作,一般來講,.S為後綴的匯編語言源代碼文件和匯編、.s為後綴的匯編語言文件經過預編譯和匯編之後都生成以.o為後綴的目標文件。當所有的目標文件都生成之後,gcc就調用ld來完成最後的關鍵性工作,這個階段就是連接。在連接階段,所有的目標文件被安排在可執行程序中的恰當的位置,同時,該程序所調用到的庫函數也從各自所在的檔案庫中連到合適的地方。 Gcc的基本用法和選項 在使用Gcc編譯器的時候,我們必須給出一系列必要的調用參數和文件名稱。Gcc編譯器的調用參數大約有100多個,其中多數參數我們可能根本就用不到,這里只介紹其中最基本、最常用的參數。 Gcc最基本的用法是∶gcc [options] [filenames] 其中options就是編譯器所需要的參數,filenames給出相關的文件名稱。 -c,只編譯,不連接成為可執行文件,編譯器只是由輸入的.c等源代碼文件生成.o為後綴的目標文件,通常用於編譯不包含主程序的子程序文件。 -o output_filename,確定輸出文件的名稱為output_filename,同時這個名稱不能和源文件同名。如果不給出這個選項,gcc就給出預設的可執行文件a.out。 -g,產生符號調試工具(GNU的gdb)所必要的符號資訊,要想對源代碼進行調試,我們就必須加入這個選項。 -O,對程序進行優化編譯、連接,採用這個選項,整個源代碼會在編譯、連接過程中進行優化處理,這樣產生的可執行文件的執行效率可以提高,但是,編譯、連接的速度就相應地要慢一些。 -O2,比-O更好的優化編譯、連接,當然整個編譯、連接過程會更慢。 -Idirname,將dirname所指出的目錄加入到程序頭文件目錄列表中,是在預編譯過程中使用的參數。C程序中的頭文件包含兩種情況∶ A)#include B)#include 「myinc.h」 其中,A類使用尖括弧(< >),B類使用雙引號(「 」)。對於A類,預處理程序cpp在系統預設包含文件目錄(如/usr/include)中搜尋相應的文件,而對於B類,cpp在當前目錄中搜尋頭文件,這個選項的作用是告訴cpp,如果在當前目錄中沒有找到需要的文件,就到指定的dirname目錄中去尋找。在程序設計中,如果我們需要的這種包含文件分別分布在不同的目錄中

8. 什麼叫 -O2編譯

【-O2編譯】編譯器提供-O選項,供程序優化使用。其中:
1、-O0表示沒有優化;
2、-O1為預設值,提供基礎級別的優化;
3、-O2 提供更加高級的代碼優化,會佔用更長的編譯時間;
4、-O3 提供最高級的代碼優化。
【編譯器】就是將「一種語言(通常為高級語言)」翻譯為「另一種語言(通常為低級語言)」的程序。一個現代編譯器的主要工作流程:源代碼 (source code) → 預處理器 (preprocessor) → 編譯器 (compiler) → 目標代碼 (object code) → 鏈接器(Linker) → 可執行程序 (executables)
高級計算機語言便於人編寫,閱讀交流,維護。機器語言是計算機能直接解讀、運行的。編譯器將匯編或高級計算機語言源程序(Source program)作為輸入,翻譯成目標語言(Target language)機器代碼的等價程序。源代碼一般為高級語言 (High-level language), 如Pascal、C、C++、Java、漢語編程等或匯編語言,而目標則是機器語言的目標代碼(Object code),有時也稱作機器代碼(Machine code)。

9. 編譯器在編譯階段,究竟做哪些事情

1. 預處理首先源代碼文件(.c/.cpp)和相關頭文件(.h/.hpp)被預處理器cpp預編譯成.i文件(C++為.ii)。預處理命令為:gcc –E hello.c –o hello.i預編譯過程主要處理那些源代碼中以#開始的預編譯指令,主要處理規則如下:u 將所有的#define刪除,並且展開所有的宏定義;u 處理所有條件編譯指令,如#if,#ifdef等;u 處理#include預編譯指令,將被包含的文件插入到該預編譯指令的位置。該過程遞歸進行,及被包含的文件可能還包含其他文件。u 刪除所有的注釋//和 /**/;u 添加行號和文件標識,如#2 「hello.c」 2,以便於編譯時編譯器產生調試用的行號信息及用於編譯時產生編譯錯誤或警告時能夠顯示行號信息;u 保留所有的#pragma編譯器指令,因為編譯器須要使用它們。2. 編譯編譯過程就是把預處理完的文件進行一系列詞法分析,語法分析,語義分析及優化後生成相應的匯編代碼文件(.s)。編譯的命令為:gcc –S hello.i –o hello.s或者從源文件直接輸出匯編代碼文件:gcc –S hello.c –o hello.s現在版本的GCC把預編譯和編譯兩個步驟合並成一個步驟,由程序cc1來完成(C++為cc1plus)。3. 匯編匯編就是將匯編代碼轉變成機器可以執行的命令,生成目標文件(.o),匯編器as根據匯編指令和機器指令的對照表一一翻譯即可完成。匯編的命令為:gcc –c hello.s –o hello.o或者從源文件直接輸出目標文件:gcc –c hello.c –o hello.o4. 鏈接鏈接就是鏈接器ld將各個目標文件組裝在一起,解決符號依賴,庫依賴關系,並生成可執行文件。鏈接的命令為:ld –static crt1.o crti.o crtbeginT.o hello.o –start-group –lgcc –lgcc_eh –lc-end-group crtend.o crtn.o一般我們使用一條命令就可以完成上述4個步驟:gcc hello.c實際上gcc只是一些其它程序的包裝,它會根據不同參數去調用預編譯編譯程序cc1、匯編器as、鏈接器ld。

熱點內容
php辦公系統 發布:2025-07-19 03:06:35 瀏覽:900
奧德賽買什麼配置出去改裝 發布:2025-07-19 02:53:18 瀏覽:42
請與網路管理員聯系請求訪問許可權 發布:2025-07-19 02:37:34 瀏覽:189
ipad上b站緩存視頻怎麼下載 發布:2025-07-19 02:32:17 瀏覽:844
phpcgi與phpfpm 發布:2025-07-19 02:05:19 瀏覽:527
捷達方向機安全登錄密碼是多少 發布:2025-07-19 00:57:37 瀏覽:693
夜魔迅雷下載ftp 發布:2025-07-19 00:39:29 瀏覽:99
增值稅票安全接入伺服器地址 發布:2025-07-19 00:20:45 瀏覽:486
solidworkspcb伺服器地址 發布:2025-07-18 22:50:35 瀏覽:823
怎麼在堆疊交換機里配置vlan 發布:2025-07-18 22:42:35 瀏覽:630