GCC編譯c語言檔案

2021-08-08 06:17:12 字數 3461 閱讀 4416

在linux下執行c語言程式

在c語言基礎中,使用gcc編譯c語言過程一般如下:

gcc 原始檔 -o 目標檔案

如: gcc hello.c -o hello

如果有多個原始檔,可以這樣來編譯:

gcc test1.o test2.o -o test

上述命令可以直接將c語言檔案編譯鏈結為可執行檔案

如果目標檔案未指定,預設輸入目標檔案為a.out

在c程式語言一書中,作者介紹的是用cc命令去編譯,通過從其他部落格了解到:cc:c compiler,即c編譯器,為unix系統的產物。gcc:gnu compiler collection。在linux中,cc與gcc是同乙個東西,cc是指向gcc的鏈結linux 下 的 cc 和 gcc

在mac系統中,cc是指向clang(蘋果的c語言編譯器)。

macbook-pro:~ james$ which cc

/usr/bin/cc

macbook-pro:~ james$ which gcc

/usr/bin/gcc

macbook-pro:~ james$ ls -al /usr/bin/cc

lrwxr-xr-x 1 root wheel 5 1 11 2017 /usr/bin/cc -> clang

關於這些區別暫時只講這麼多,接下來我們不用上面所列的一次完成的gcc命令,而是分布完成編譯,體驗一下c語言的編譯過程。

首先,準備乙個牛叉的c語言檔案,檔名為hello.c,檔案內容如下:

#include int main()
這個原始檔大小為71 b.

編譯過程

預編譯

gcc -e hello.c -o hello.i
上面生成檔案hello.i,檔案大小為4,100b,這時預處理器將stdio.h的內容直接插入到程式中。(難道這就是稱#include為預處理命令的原因?)

2. 編譯為彙編**

gcc -s hello.i -o hello.s

//生成的hello.s檔案大小670b,檔案內容如下:

.section

__text,__text,regular,pure_instructions

.macosx_version_min 10, 12

.globl _main

.p2align 4, 0x90

_main: ## @main

.cfi_startproc

## bb#0:

pushq %rbp

ltmp0:

.cfi_def_cfa_offset 16

ltmp1:

.cfi_offset %rbp, -16

movq %rsp, %rbp

ltmp2:

.cfi_def_cfa_register %rbp

subq $16, %rsp

leaq l_.str(%rip), %rdi

movl $0, -4(%rbp)

movb $0, %al

callq _printf

xorl %ecx, %ecx

movl %eax, -8(%rbp) ## 4-byte spill

movl %ecx, %eax

addq $16, %rsp

popq %rbp

retq

.cfi_endproc

.section __text,__cstring,cstring_literals

l_.str: ## @.str

.asciz "hello world\n"

.subsections_via_symbols

這時生成的hello.s即為乙個匯程式設計序

組合語言是將不同高階語言的不同編譯器提供了通用的輸出語言。

3. 彙編為目標檔案

gcc -c hello.s -o hello.o

//生成的hello.o檔案大小768b,生成的檔案內容如下:

cffa edfe 0700 0001 0300 0000 0100 0000

0400 0000 0002 0000 0020 0000 0000 0000

1900 0000 8801 0000 0000 0000 0000 0000

.........

2400 0000 1c00 0000 88ff ffff ffff ffff

2a00 0000 0000 0000 0041 0e10 8602 430d

0600 0000 0000 0000 1900 0000 0100 002d

0b00 0000 0200 0015 0000 0000 0100 0006

0100 0000 0f01 0000 0000 0000 0000 0000

0700 0000 0100 0000 0000 0000 0000 0000

005f 6d61 696e 005f 7072 696e 7466 0000

鬼知道這裡是啥意思,這是乙個二進位制檔案。離成為可執行檔案只差鏈結庫了。

4. 鏈結並生成可執行檔案

gcc hello.o -o hello

//生成hello,檔案大小8,432b,開啟內容也是二進位制

cffa edfe 0700 0001 0300 0080 0200 0000

0f00 0000 b004 0000 8500 2000 0000 0000

1900 0000 4800 0000 5f5f 5041 4745 5a45

524f 0000 0000 0000 0000 0000 0000 0000

0000 0000 0100 0000 0000 0000 0000 0000

........

//這中間有至少50行全為0

0000 0040 0200 0000 2000 5f5f 6d68 5f65

7865 6375 7465 5f68 6561 6465 7200 5f6d

6169 6e00 5f70 7269 6e74 6600 6479 6c64

5f73 7475 625f 6269 6e64 6572 0000 0000

生成的hello檔案可以執行如下:

macbook-pro:c james$ ./hello

hello world

總結:

編譯器的編譯過程:

原始檔-->預處理-->編譯/優化-->彙編-->鏈結–>可執行檔案。

乙個最簡單的hello world,電腦幫我們做了這麼多事情,看來也不容易啊。

gcc編譯c 檔案

gcc是編譯c語言的,預設情況下,如果直接編譯c 程式,會報錯 root server demo2 ls hello.cpp root server demo2 cat hello.cpp include using namespace std int main endifcircle.cpp in...

gcc編譯c語言程式

編譯 當前源 編譯成二進位制目標檔案 obj檔案 乙個現代編譯器的主要工作流程如下 源程式 source code 預處理器 preprocessor 編譯器 compiler 匯程式設計序 assembler 目標程式 object code 聯結器 鏈結器,linker 可執行程式 execut...

C語言基礎 gcc編譯

ubuntu編譯c與c 檔案環境配置sudo apt install gcc sudo apt install g 驗證環境cd usr bin ls gcc ls g 通過gcc編譯c檔案gcc address filename.c o address file ubuntu a.out file...