❶ 關於C語言的編譯過程,GCC與windows下的c編譯器(如VS2010)的編譯過程是否存在區別
一般的編譯步驟是如此, 但也有一步到位的編譯器
❷ 請問c語言的源程序被編譯後的代碼是機器碼嗎
首先語言和被編譯成的代碼沒有直接關系。有把Java編譯成機器碼的編譯器也有把C語言編譯成Java位元組碼的編譯器。
機器碼只是CPU直接認讀的編碼,不等於和硬體打交道的。操作硬體是你通過程序操作CPU做到的。操作系統只不過是別人寫的程序而已,說到底還是程序。
❸ 請問linux下,gcc編譯程序的過程(從讀取源文件到製作可執行程序中間所有過程,越詳細越好)
gcc -S *.c 預處理+反匯編
❹ 器GCC開發的軟體,一定就是開源軟體么
gcc是開源的,不意味著,用它編譯的程序也是開源的,gcc是個編譯器,用它編譯也會生成2進制的機器碼
你寫的程序是否開源取決於你自己
你想不開源,就編譯,你想開源就別編譯,直接把源碼發布出去
開源是啥意思,你用任何文本編輯器編寫一個程序(即便不用GCC),這些文本文件都是源程序
用任意一款編譯器編譯後,都將生成2進制機器碼,不管那款編譯器,不管編譯器是不是開源的,編譯器編譯器,何為編譯器,"編譯"的意思,就是把你寫的源文件,翻譯成計算機能識別的2進制機器碼,所以提到"編譯"二字就已經意味著不開源了
❺ C語言如何編譯成可以直接在CPU運行的二進制碼
你編譯好的可執行文件就是二進制文件,包括機器碼指令和數據。Linux上生成的一般是ELF格式,帶文件頭和段記錄,你可以用strip什麼的去掉。
❻ Linux下的gcc編譯後生成Linux下的可執行文件,window下gcc編譯後是exe文件,為什麼不一樣啊是怎麼做到的
首先,這win和Linux下的gcc功能是一樣的,實際的gcc.exe和linux下的gcc這兩個文件不是一樣的,他們畢竟需要在工作在不同的平台上,而且他們做的一些工作是有區別的。
編譯過程是把源文件翻譯成機器碼,然後鏈接成一個整體,拼接成一個文件。不管是win下的exe還是Linux下的ELF,都是按照一定規范來的,比如頭部放什麼,尾部放什麼,中間又存哪些信息等。但是,如果要編譯出正確的可執行的文件,不同的操作系統里就必須按照不同的規范來組織這個文件。
這些文件的執行過程,並不是說它們可以直接執行,執行的時候,系統把它們從磁碟上,讀到內存中,經過一系列的前期工作,才可以最終執行起來,這個前期過程都是操作系統來搞定的。
你不應該問gcc是怎麼做到的,而應該問gcc為什麼需要這樣。如果你需要知道細節,去看《程序員的自我修養》
❼ C語言代碼怎麼編譯成.o文件再怎麼變成.exe文件
linux下gcc -c wen.c -o wen.o 生成.o文件gcc wen.o -o wen 就變成.exe文件
❽ C語言編譯後是生成匯編代碼還是直接生成機器代碼
不會是這兩種語言代碼,而是編譯後直接生成二進制文件(.obj文件),再通過連接器鏈接成二進制文件(.exe/.dll/.ocx/.sys等)
❾ 怎麼用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++,怎樣學習c++,c++和vc++的區別是什麼
c++的編譯器常見的有 微軟的, GCC(linux下最常用的,也有windows版本,叫mingw) 和 intel的(intel有不少好東西,對性能要求高的話可以考慮)
但是集成開發環境就多了 微軟的 visual studio (VC6 VC2005 VC2008)系列,也可以把intel的編譯器掛到VS下面,取代微軟的編譯器,dev-c++ 和 codeblocks 這兩個用的都是用的GCC的編譯器。
windows下 ,最好不用命令行編譯很麻煩的,大一點的項目還要寫makefile來管理,linux下 g++ -o file file.cc 然後 ./file 就能執行剛才的程序了
學C++ 多練 多寫代碼 找本好的參考書 比如 c++ primer ,教材隨便找本就行了 網上可以下到電子書的
c++是一門語言 而VC++通常指的是微軟為了開發windows下的圖形界面程序,而給出的一些API函數,以及封裝了這些API函數的MFC庫,它們的語法是C++的語法。C++在linux下可以照常使用,但VC++到了linux下就沒法用了,因為linux下沒有MFC庫,當然它也有自己的一些圖形庫