當前位置:首頁 » 編程軟體 » 文件在編譯

文件在編譯

發布時間: 2023-05-29 18:55:56

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

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。

❷ 在VIM裡面是怎樣編譯c語言的文件

一、首先要會使用vim編寫一個c文件
1.在linux終端下輸入:
vi
test.c
表示生成了一個test.c的c語言文件
2.此時時命令模式,按"a"鍵或者"i"進入輸入模式,然後就是輸入C語言代碼
3.保存文件,再次回到命令模式,按"ESC「鍵,然後按":"鍵再輸入"wq」表示保存退出
二、然後在用gcc編譯test.c文件
直接輸入
gcc
-o
mytest
test.c即可
表示直接生成mytest執行文件

❸ 在linux中,怎麼用gcc編譯文件

在終端中輸入 gcc 文件名 -o 目標文件名
然後 ./目標文件名 就行了,沒有目標文件名,自動存為 a
執行 ./a 就行了。

在使用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 <myinc.h>
B)#include 「myinc.h」
其中,A類使用尖括弧(< >),B類使用雙引號(「 」)。對於A類,預處理程序cpp在系統預設包含文件目錄(如/usr/include)中搜尋相應的文件,而B類,預處理程序在目標文件的文件夾內搜索相應文件。

GCC執行過程示例

示例代碼 a.c:
#include <stdio.h>
int main()
{
printf("hello\n");
}
預編譯過程:
這個過程處理宏定義和include,並做語法檢查。
可以看到預編譯後,代碼從5行擴展到了910行。
gcc -E a.c -o a.i
cat a.c | wc -l
5
cat a.i | wc -l
910
編譯過程:
這個階段,生成匯編代碼。
gcc -S a.i -o a.s
cat a.s | wc -l
59
匯編過程:
這個階段,生成目標代碼。
此過程生成ELF格式的目標代碼。
gcc -c a.s -o a.o
file a.o
a.o: ELF 64-bit LSB relocatable, AMD x86-64, version 1 (SYSV), not stripped
鏈接過程:
鏈接過程。生成可執行代碼。鏈接分為兩種,一種是靜態鏈接,另外一種是動態鏈接。使用靜態鏈接的好處是,依賴的動態鏈接庫較少,對動態鏈接庫的版本不會很敏感,具有較好的兼容性;缺點是生成的程序比較大。使用動態鏈接的好處是,生成的程序比較小,佔用較少的內存。
gcc a.o -o a
程序運行:
./a
hello
編輯本段
GCC編譯簡單例子

編寫如下代碼:
#include <stdio.h>
int main()
{
printf("hello,world!\n");
}
執行情況如下:
gcc -E hello.c -o hello.i
gcc -S hello.i -o hello.s
gcc -c hello.s -o hello.o
gcc hello.c -o hello
./hello
hello,world!

❹ 被包含文件是在編譯時先單獨生成目標文件,然後連接到可執行文件中去. 對嗎

不知道你是說那種語言,如果是C/C++的話,一般我們使用#include指令包含頭文件(當然,頭文件也是可以有實現),編譯器首先通過預編譯,將所有使用#include的地方全部使用包含的文件替換,然後在執行編譯,所以被包含不會生成單獨的目標文件
生成單獨的目標文件一般是頭文件的實現文件,頭文件的實現就是先編譯成單獨的目標文件,然後通過鏈接器連接到一起,成為一個完整的可執行文件

❺ cpp文件在VS2010環境下如何編譯

無論VS2010還是VC6,都需要工程才能編譯鏈接和執行(TC不需要)
根據代碼的具體情況創建對應的工程,並將CPP復制到工程目錄並加入到工程即可。
一般控制台工程和win32 console的可能性比較大。

❻ 如何在linux上編譯c工程文件

linux終端下,編譯C語言程序步驟為:採用vi進行源代碼編寫,編寫完成後,:wq存檔退出,如:vi test.c
在命令行下,運行gcc編譯程序,生成執行碼,如:gcc -o test test.c-o 表示指明生成的執行碼名稱
運行編譯後的執行碼./test

❼ 如何在Windows下用命令行編譯C/C++文件

在控制台編譯運行一個C程序,在windows上的c語言編譯器為cl.exe,在linux平台上的c語言編譯器是gcc。
在命令提示符中,執行cl
test.c(test.c是c語言源碼文件)。下圖是用cl編譯器編譯main.cxx的誰的,並且執行生成的程序main.exe。

❽ C語言,頭文件總是無法在編譯中出錯

可能是你編譯器設置的問題,看看設置的預設目錄是否正確。另外當前目錄包含頭文件用雙引號不用尖括弧即:

#include "stdint.h"

熱點內容
iso資料庫 發布:2024-04-24 13:05:09 瀏覽:160
it的編程語言有哪些 發布:2024-04-24 13:01:05 瀏覽:612
劉殺雞錄像廳的密碼是多少 發布:2024-04-24 13:01:04 瀏覽:736
蒼天腳本 發布:2024-04-24 13:00:59 瀏覽:401
我的世界伺服器查詢ip 發布:2024-04-24 13:00:53 瀏覽:19
詳細設計存儲分配 發布:2024-04-24 12:59:51 瀏覽:753
我的世界美服伺服器 發布:2024-04-24 12:39:36 瀏覽:15
linuxc文件函數 發布:2024-04-24 12:39:32 瀏覽:819
編譯過程測試視頻 發布:2024-04-24 12:39:31 瀏覽:21
百度語音python3 發布:2024-04-24 12:29:21 瀏覽:607