⑴ gcc 生成 .o 文件時問什麼必須要目標文件名,不是可以默認嗎
總體看沒同都
文件、段表、段內容格式
往內容看兩者區別g++文件C++gcc文件作C首先符號規則(name mangling)連接庫
有兩種方法
1。保存好你編譯的c文件,假如你的文件名是main.c,這是源文件,我們要把它編譯成目標文件即以.o結束的文件(gcc -c main.c) ,再使用ll main*就可以查看到生成的目標文件,再將目標文件生成可執行文件(gcc -o main main.o) ,這里用main替代生成的可執行文件,再使用ll main*就可以查看到生成的可執行文件main,最後就是執行可執行文件了(sh main),這樣就可以得到結果了。
2。可以一步到位,直接生成可執行文件,gcc -o main main.o,執行方法如方法一,用方法一可以看到詳細的執行過程,建議使用方法1
⑵ 如何指定GCC的默認頭文件路徑
看下文的紅色部分。 有大量的環境變數可供設置以影響 GCC 編譯程序的方式。利用這些變數的控制也可使用合適的命令行選項。一些環境變數設置在目錄名列表中。這些名字和 PATH 環境變數使用的格式相同。特殊字元 PATH_SEPARATOR (安裝編譯程序的時候定義)用在目錄名之間。在 UNIX 系統中,分隔符是冒號,而 Windows 系統中為分號。 C_INCLUDE_PATH 編譯C 程序時使用該環境變數。該環境變數指定一個或多個目錄名列表,查找頭文件,就好像在命令行中指定 -isystem 選項一樣。會首先查找 -isystem 指定的所有目錄。 ==> 也見 CPATH 、 CPLUS_INCLUDE_PATH 和 OBJC_INCLUDE_PATH 。 COMPILER_PATH 該環境變數指定一個或多個目錄名列表,如果沒有指定 GCC_EXEC_PREFIX 定位子程序,編譯程序會在此查找它的子程序。 ==> 也見 LIBRARY_PATH 、 GCC_EXEC_PREFIX 和 -B 命令行選項。 CPATH 編譯C 、 C++ 和 Objective-C 程序時使用該環境變數。該環境變數指定一個或多個目錄名列表,查找頭文件,就好像在命令行中指定 -l 選項一樣。會首先查找 -l 指定的所有目錄。 ==> 也見 C_INCLUDE_PATH 、 CPLUS_INCLUDE_PATH 和 OBJC_INCLUDE_PATH 。 CPLUS_INCLUDE_PATH 編譯C++ 程序時使用該環境變數。該環境變數指定一個或多個目錄名列表,查找頭文件,就好像在命令行中指定 -isystem 選項一樣。會首先查找 -isystem 指定的所有目錄。 ==> 也見 CPATH 、 C_INCLUDE_PATH 和 OBJC_INCLUDE_PATH 。 DEPENDENCIES_OUTPUT 為文件名設置該環境變數會讓預處理程序將基於依賴關系的 makefile 規則寫入文件。不會包括系統頭文件名字。 如果環境變數設置為單名,被看作是文件名字,而依賴關系規則的名字來自源文件名字。如果定義中有兩個名字,則第二個名字是用作依賴關系規則的目標名。 設置該環境變數的結果和使用命令行選項 -MM 、 -MF 和 -MT 的組合是一樣的。 ==> 也見 SUNPRO_DEPENDENCIES 。 GCC_EXEC_PREFIX 如果定義了該環境變數,它會作為編譯程序執行的所有子程序名字的前綴。例如,如果將變數設置為 testver 而不是查找 as ,匯編器首先會在名字 testveras 下查找。如果在此沒有找到,編譯程序會繼續根據它的普通名進行查找。可在前綴名中使用斜線指出路徑名。 GCC_EXEC_PREFIX 的默認設置為 prefix /lib/gcc-lib/ ,這里的 prefix 是安裝編譯程序時 configure 腳本指定的名字。該前綴也用於定位標准連接程序文件,包含進來作為可執行程序的一部分。 如果使用 -B 命令行選項,會重寫該設置。 ==> 也見 COMPILER_PATH 。 LANG 該環境變數用於指出編譯程序使用的字元集,可創建寬字元文字、串文字和注釋。 定義LANG 為 C-JIS ,指出預處理程序將多位元組字元按照 JIS (日語工業標准)字元進行解釋。 C-SJIS 可用來指出 Shift -JIS 字元而 C-EUCJP 指出日文 EUC 。 如果沒有定義 LANG ,或定義為不可識別,函數 mblen() 被用來確定字元寬度,而 mbtowc() 用來將多位元組序列轉換為寬字元。 LC_ALL 如果設置,該環境變數的值重寫 LC_MESSAGES 和 LC_CTYPE 的所有設置。 LC_CTYPE 該環境變數指出引用串中定義的多位元組字元的字元分類。主要用於確定字元串的字元邊界,字元編碼需要用引號或轉義符,可被錯誤地解釋為字元串的結尾或特殊字 符串。對 Australian English ,可將它設置為 en_AU ;對 Mexican Spanish ,可將它設置為 es_MX 。如果沒有設置該變數,默認為 LANG 變數的值,或如果沒有設置 LANG ,那就使用 C 英語行為。也見 LC_ALL 。 LC_MESSAGES 該環境變數指出編譯程序使用何種語言發出診斷消息。對 Australian English ,可設置為 en_AU ;對 MexicanSpanish ,可設置為 es_MX 。如果變數沒有設置,使用 LANG 變數的默認值,或如果沒有設置 LANG ,那就使用 C 英語行為。也見 LC_ALL 。 LD_LIBRARY_PATH 該環境變數不會影響編譯程序,但程序運行的時候會有影響。變數指定一個目錄列表,程序會查找該列表定位共享庫。只有當未在編譯程序的目錄中找到共享庫的時候,執行程序必須設置該變數。 LD_RUN_PATH 該環境變數不會影響編譯程序,但程序運行的時候會有影響。該變數在運行時指出文件的名字,運行的程序可由此得到它的符號名字和地址。地址不會重新載入,因而可能符號引用其他文件中的絕對地址。這和 ld 工具使用 -R 選項完全一樣。 LIBRARY_PATH 該環境變數可設置為一個或多個目錄名字列表,連接程序會搜尋該目錄,以查找特殊連接程序文件,和由 -l (字母 l )命令行選項指定名字的庫。 由 -L 命令行選項指定的目錄在環境變數的前面,首先被查找。 ==> 也見 COMPILER_PATH 。 OBJC_INCLUDE_PATH 在編譯 Objective-C 程序的時候使用該環境變數。一個或多個目錄名的列表由環境變數指定,用來查找頭文件,就好像在命令行中指定 -isystem 選項一樣。所有由 -isystem 選項指定的目錄會首先被查找。 S
⑶ gcc編譯問題
-c和-o都是gcc編譯器的可選參數。-c表示只編譯(compile)源文件但不鏈接,會把.c或.cc的c源程序編譯成目標文件,一般是.o文件。-o用於指定輸出(out)文件名。不用-o的話,一般會在當前文件夾下生成默認的a.out文件作為可執行程序。
⑷ 選擇題:由C++源程序文件編譯而成的目標文件的默認擴展名為( )。A)cpp B)exe C)obj D)lik
由C++源程序文件編譯而成的目標文件的默認擴展名為:obj。
在VC6.0集成開發環境下,用戶可以使用編譯(compile)命令將一個.cpp為擴展名的C++源程序文件轉換成一個以.obj為擴展名的目標文件。
編譯,編譯程序讀取源程序(字元流),對之進行詞法和語法的分析,將高級語言指令轉換為功能等效的匯編代碼,再由匯編程序轉換為機器語言,並且按照操作系統對可執行文件格式的要求鏈接生成可執行程序。
(4)gcc編譯器默認的目標文件名稱擴展閱讀
源代碼-->預處理-->編譯-->優化-->匯編-->鏈接-->可執行文件
編譯過程就是把預處理完的文件進行一系列的詞法分析,語法分析,語義分析及優化後生成相應的匯編代碼。
現在版本的GCC把預處理和編譯兩個步驟合成一個步驟,用cc1工具來完成。gcc其實是後台程序的一些包裝,根據不同參數去調用其他的實際處理程序,比如:預編譯編譯程序cc1、匯編器as、連接器。
編譯器在編譯時是以c/c++文件為單位進行的, 如果項目中沒有c/c++文件,那麼你的項目將無法編譯。
經過預編譯得到的輸出文件中,將只有常量。如數字、字元串、變數的定義,以及C語言的關鍵字,如main,if,else,for,while,{,},+,-,*,,等等。編譯程序所要作得工作就是通過詞法分析和語法分析,在確認所有的指令都符合語法規則之後,將其翻譯成等價的中間代碼表示或匯編代碼。
⑸ .c或.cpp編譯完的中間文件必須是.o嗎自定義一個後綴名的中間文件可以後續link嗎
首先回答一下你的疑問:
.c或.cpp編譯完的中間文件不是必須是.o後綴,可以自定義後綴名。.o是GCC之類編譯器默認的目標文件後綴名,VC一般是.obj。
自定義的後綴名後面也是可以進行正常的鏈接,具體操作例子如下:
假如有兩個源文件a.c 和b.c
首先用命令編譯成目標文件:
gcc -c a.c -o a.obj
gcc -c b.c -o b.obj
這里可以通過-o修改默認文件及後綴名,這里已經改變.obj了。
然後進行鏈接
gcc a.obj b.obj -o test.exe
就可以生成test.exe可執行文件。
⑹ C語言編譯程序屬於什麼軟體
是GCC。
GCC幾乎是unix及linux系統中最通用的編譯器套件,幾乎所有的linux發行版都預裝了GCC作為C語言的默認編譯器。除了對C語言的支持,GCC還支持C++、Objective-C等多種語言。GCC早在1987就由 Richard Stallman作為GNU計劃的一部分發布。
但其對C/C++標準的支持不亞於GCC等老牌編譯器,並且外部介面和GCC完全兼容,並且因其模塊化、錯誤提示完善等優點已經越來越受到重視。一些如FreeBSD等項目已將clang作為默認編譯器。
基本用法
在使用GCC編譯器的時候,必須給出一系列必要的調用參數和文件名稱。GCC編譯器的調用參數大約有100多個,這里只介紹其中最基本、最常用的參數。具體可參考GCC Manual。
GCC最基本的用法是∶gcc [options] [filenames]其中options就是編譯器所需要的參數,filenames給出相關的文件名稱。-c,只編譯,不鏈接成為可執行文件,編譯器只是由輸入的.c等源代碼文件生成.o為後綴的目標文件,通常用於編譯不包含主程序的子程序文件。
以上內容參考:網路-gcc
⑺ 怎麼用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!
⑻ unix下makefile中cc-g-bnoquiet-brtl-bexpall-o是什麼意思
cc 通常指的是編譯器,你可以在makefile里查找cc所指代的具體編譯器。貌似你所用的編譯器為xlc
-g -bnoquiet -brtl -bexpall -o 這些指的是編譯器的參數,具體的編譯器有具體的解釋基本相似,但有所不同
以GCC編譯器為例,參數的意思分別為:
-o
制定目標名稱,預設的時候,gcc 編譯出來的文件是a.out,很難聽,如果
你和我有同感,改掉它,哈哈
例子用法
gcc -o hello.exe hello.c (哦,windows用習慣了)
gcc -o hello.asm -S hello.c
-g
只是編譯器,在編譯的時候,產生條是信息。
...
具體你可以查看 參考文獻
man xlc
或者xlc --help 查看具體參數-bnoquiet -brtl -bexpall 的含義
⑼ gcc編譯後的文件怎樣運行
Windows系統
假如生成的可執行文件名稱為prog.exe,位於D:\cpp文件夾下,那麼打開命令行,運行下面兩條命令
cd D:\cpp
prog.exe
注意,如果用gcc編譯的時候未指定可執行文件名稱,則默認為a.exe
Linux系統
假如生成的可執行文件名稱為prog,位於home下的CPP文件夾,那麼打開終端,運行下面兩條命令
cd ~/CPP
./prog
注意,如果用gcc編譯的時候未指定可執行文件名稱,則默認為a.out
⑽ linux C編程
gcc編譯器很不錯啊。