goc編譯器的編譯過程中的鏈接
1、編輯:編寫代碼,製作C語言的源文件。
2、編譯:是由編譯程序將C語言源文件轉換成二進制中間文件,對文件內部的語法語義做處理,如果編譯出錯,無法進行後續動作。
3、鏈接:將編譯中生成的中間文件組合成二進制可執知行文件,這一步會對文件之間的關聯做檢查,如果出錯,將不會生成可執行文件,也就無法執行。
4、執行:運行可執行文件,這一步道是編寫代碼的最終目的。
(1)goc編譯器的編譯過程中的鏈接擴展閱讀:
DOS命令通常分為三類:內部命令、外部命令和批處理命令。
1、內部命令:
其包含在命令解釋程序COMMAND.COM中,一旦啟動DOS,這些命令就被調入內存,只要在DOS系統提示符下輸入這些命令,就可立即執行。
2、外部命令:
其以文件的形式存儲在系統盤上,所帶擴展名為COM和EXE。DOS啟動時,它們並沒有被調入內存,執行前必須從系統盤讀進內存。因此輸入外部命令時,要了解該命令是否在當前盤上,不然DOS無法找到它們。
3、批處理命令:
實際上是個文件,該文件包含多條命令,當用戶鍵入批處理文件名時,DOS將順序執行其中的各條命令。注意,批處理命令必須用「.BAT」作為擴展名。
C語言的運算非常靈活,功能十分豐富,運算種類遠多於其它程序設計語言。在表達式方面較其它程序語言更為簡潔,如自加、自減、逗號運算和三目運算使表達式更為簡單。
當多種不同運算組成一個運算表達式,即一個運算式中出現多種運算符時,運算的優先順序和結合規則就會顯得十分重要。
網路-運行命令
網路-C語言
『貳』 簡述一下編譯器和鏈接器的作用
1、編譯器:
編譯器對源文件進行編譯,就是把源文件中的文本形式存在的源代碼翻譯成機器語言形式的目標文件的過程,在這個過程中,編譯器會進行一系列的語法檢查。如果編譯通過,就會把對應的CPP轉換成OBJ文件。
2、鏈接器:
當鏈接器進行鏈接的時候,首先決定各個目標文件在最終可執行文件里的位置。然後訪問所有目標文件的地址重定義表,對其中記錄的地址進行重定向(加上一個偏移量,即該編譯單元在可執行文件上的起始地址)。
然後遍歷所有目標文件的未解決符號表,並且在所有的導出符號表裡查找匹配的符號,並在未解決符號表中所記錄的位置上填寫實現地址。最後把所有的目標文件的內容寫在各自的位置上,再作一些另的工作,就生成一個可執行文件。
『叄』 匯編語言的那個編譯鏈接 的詳細過程 每一步驟
LZ請跟著我的操作走
1.將寫好的匯編代碼保存為1.asm
2.將1.asm復制到c盤下
3.點開始(即左下標那個windows圖標),找到運行,或(附件中的命令提示符)
4.找到運行後,輸入cmd 或 command
5.進入後輸入cd c:\
6.輸入masm 1;(1後面有分號),然後回車
7.輸入link 1;然後回車
8.cls清屏然後回車
9.輸入1.exe,然後回車
10.完成
至於怎麼debug
步驟:
1-8同上
9.輸入debug 1.exe,然後回車
10.完成
至於debug 中的 'r' 'd' 't' 自己上網找大把
我的系統是win 7,
你的masm 和 link debug 要放在C:\Windows文件夾下
PS: 若有不明白的地方,可以追問
『肆』 為什麼要對C源程序進行編譯、鏈接
首先要說的是C語言屬於高級語言,不能直接被計算機識別而執行,所以需要一些操作來轉化。。一開始是編譯預處理,對宏,包含指令,編譯指令等進行處理,然後是詞法語法分析,將源代碼翻譯成中間代碼(一般是匯編),接著優化代碼,,然後將中間代碼翻譯成機器語言(目標文件),機器語言是計算機的基層語言,能被計算機直接識別。。接著鏈接目標文件,生成可以執行文件。。。大概就是這樣。。詳細的LZ可看這個總結。。http://bbs.zdnet.com.cn/thread-1614727-1-1.html
『伍』 gcc,g++的編譯之後的鏈接
通常找不到指定函數不是因為編譯參數問題。而是你 g.cpp 中在include f.h的時候沒有使用:
extern "C" {
#include"f.h"
}
因為C語言和cpp的編譯過程中的函數名稱修飾規則是不一樣的。當cpp引用C庫的時候必須告訴編譯器,哪些函數是C函數,編譯器會按照C的名稱修飾去函數庫中搜索函數,這樣才能正常鏈接。
你通常不需要手動使用ld 命令。直接使用gcc 命令就可以了
gcc -oa.out f.a g.o
就可以了。它會自動調用ld 命令。
『陸』 程序的編譯鏈接過程
stdio.h 只是一個函數聲明的頭文件, 實現在已經編譯好的庫文件中,一般情況 IDE 會自動連接標准庫,不需要你管。
『柒』 c++ 編譯器 鏈接器 如何運行 原理是什麼
#include "fun.cpp"
這一句使得在編譯的時候fun.cpp全文將被復制到主程序文件中,在主文件裡面當然能使用了,這不是文件作用域的問題。
至於前一個問題,你沒給出程序的全文,我也看不出來。
另外:對樓主的回復:
你對fun.cpp也使用include的話,則fun.cpp中的內容肯定也是要復制過去的,只要你用include。(include這個保留字的含義就是告訴編譯器除了讀包含include這個語句的文件之外還要讀取include語句包含的文件).一般來說,我們在include後麵包含的都是xxxx.h這樣的頭文件,這是因為在頭文件裡麵包含的都是聲明而不是定義,在一個工程中聲明可以重復多次但是定義(不管它在哪個文件裡面定義)只能一次。像樓主這樣包含fun.cpp的話肯定會導致重復定義的(fun.h和fun.cpp編譯之後形成的fun.obj裡面有函數的實現,main.cpp由於把fun.cpp裡面的內容include進來所以裡面也有函數的實現).至於加了static後為什麼對這是因為static保留字限制了其後所定義的函數或變數只能在本文件中使用.
建議樓主把主程序文件中的#include"fun.cpp"改成#include"fun.h"再試試,另外,找本書看看include和static(主要是靜態全局變數而不是靜態局部變數)相關的內容。
對樓主的再次答復:.h和.cpp中包含的東西是不一樣的。一般來說,.h中放置聲明語句(主要是供編譯器進行類型及函數原型檢查),而.cpp中放置數據的定義以及函數的實現等。而#include語句只包含.h文件。這一點我不知道是不是c語言的規定,但是一般來說編程都是這樣做的。
如果不怕困難,建議你去看一本書,linker and loader 中文版+英文版,網址是:http://download.csdn.net/source/331053
『捌』 linux中gcc編譯器的鏈接過程是怎麼樣的
1.動量:p=mv {p:動量(kg/s),m:質量(kg),www.fps56.com,v:速度(m/s),方向與速度方向相同}
3.沖量:I=Ft {I:沖量(N·s),F:恆力(N),t:力的作用時間(s),方向由F決定}
4.動量定理:I=Δp或Ft=mvt–mvo {Δp:動量變化Δp=mvt–mvo,是矢量式}
5.動量守恆定律:p前總=p後總或p=p』′也可以是m1v1+m2v2=m1v1′+m2v2′
6.彈性碰撞:Δp=0;ΔEk=0 {即系統的動量和動能均守恆}
7.非彈性碰撞Δp=0;0<ΔEK<ΔEKm {ΔEK:損失的動能,EKm:損失的最大動能}
8.完全非彈性碰撞Δp=0;ΔEK=ΔEKm {碰後連在一起成一整體}
9.物體m1以v1初速度與靜止的物體m2發生彈性正碰:
『玖』 linux下鏈接過程中編譯器會做哪些工作
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.o
4. 鏈接
鏈接就是鏈接器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。
『拾』 程序的編譯期,鏈接期, 運行期各執行哪些操作
參考一下:
源文件的編譯過程包含兩個主要階段,而它們之間的轉換是自動的。第一個階段是預處理階段,在正式的編譯階段之前進行。預處理階段將根據已放置在文件中的預處理指令來修改源文件的內容。#include指令就是一個預處理指令,它把頭文件的內容添加到.cpp文件中還有其他許多預處理指令
這個在編譯之前修改源文件的方式提供了很大的靈活性,以適應不同的計算機和操作系統環境的限制。一個環境需要的代碼跟另一個環境所需的代碼可能有所不同,因為可用的硬體或操作系統是不同的。在許多情況下,可以把用於不同環境的代碼放在同一個文件中,再在預處理階段修改代碼,使之適應當前的環境。
預處理器顯示為一個獨立的操作,但一般不能獨立於編譯器來執行這個操作。調用編譯器會自動執行預處理過程,之後才編譯代碼。
編譯器為給定源文件輸出的是機器碼,執行這個過程需要較長時間。在對象文件之間並沒有建立任何連接。對應於某個源文件的對象文件包含在其他源文件中定義的函數引用或其他指定項的引用,而這些函數或項仍沒有被解析。同樣,也沒有建立同庫函數的鏈接。實際上,這些函數的代碼並不是文件的一部分。這些工作是由鏈接程序(有時稱為鏈接編輯器)完成的
鏈接程序把所有對象文件中的機器碼組合在一起,並解析它們之間的交叉引用。它還集成了對象模塊所使用的庫函數的代碼。這是鏈接程序的一種簡化表示,因為這里假定在可執行模塊中,模塊之間的所有鏈接都是靜態建立的。實際上有些鏈接是動態的,即這些鏈接是在程序執行時建立的。
鏈接程序靜態地建立函數之間的鏈接,即在程序執行之前建立組成程序的源文件中所包含的函數鏈接。動態建立的函數之間的鏈接(在程序執行過程中建立的鏈接)將函數編譯並鏈接起來,創建另一種可執行模塊—— 動態鏈接庫或共享庫。動態鏈接庫中的函數鏈接是在程序調用函數時才建立的,在程序調用之前,該鏈接是不存在的。
動態鏈接庫有幾個重要的優點。一個主要的優點是動態鏈接庫中的函數可以在幾個並行執行的程序之間共享,這將節省相同函數佔用的內存空間。另一個優點是動態鏈接庫在調用其中的函數之前是不會載入到內存中的。也就是說,如果不使用給定動態鏈接庫中的函數,該動態鏈接庫就不會佔用內存空間