登陆

极彩娱乐手机板-c言语怎样编译(具体示例)

admin 2020-02-14 238人围观 ,发现0个评论

gcc指令其实顺次履行了四步操作:1.预处理(Preprocessing), 2.编译(Compilation), 3.汇编(Assemble), 4.链接(Linking)。

为了下面进程解说的便利,咱们需求一个略微杂乱一点的比如。假定咱们自己界说了一个头文件mymath.h,完结一些自己的数学函数,并把具体完结放在mymath.c傍边。然后写一个test.c程序运用这些函数。程序目录结构如下:

├── test.c

└── inc

├── mymath.h

└── mymath.c

程序代码如下:

// test.c

#include

#includ床第e "mymath.h"极彩娱乐手机板-c言语怎样编译(具体示例)// 自界说头文件

int main(){

int a = 2;

int b = 3;

int sum = add(a, b);

printf("a=%d, b=%d, a+b=%d\n", a, b, sum);

}

头文件界说:

// mymath.h

#ifndef MYMATH_H

#define MYMATH_H

int add(int a, int b);

int sum(int a, int b);

#endif

头文件完结:

// mymath.c

int add(int a, int b){

return a+b;

}

int sub(int a, int b){

return a-b;

}

1.预处理(Preprocessing)

预处理用于将一切的#include头文件以及宏界说替换成其真实的内容,预处理之后得到的依然是文本文件,但文件体积会大许多。gcc的预处理是预处理器cpp来完结的,你能够通过如下指令对test.c进行预处理:

gcc -E -I./inc test.c -o test.i

或许直接调用cpp指令

$ cpp test.c -I./inc -o test.i

上述指令中-E是让编译器在预处理之后就退出,不进行后续编译进程;-I指定头文件目录,这儿指定的是咱们自界说的头文件目录;-o指定输出文件名。

通过预处理之后代码体积会大许多:

X文件名文件巨细代码行数

预处理前test.c146B9

预处理后test.i17691B857

预处理之后的程序仍是文本,能够用文本编辑器翻开。

2.编译(Compilation)

这儿的编译不是指程序从源文件到二进制程序的悉数进程,而是指将通过预处理之后的程序转换成特定汇编代码(assembly code)的进程。编译的指定如下:

$ gcc -S -I./inc test.c -o test.s

上述指令中-S让编译器在编译之后中止,不进行后续进程。编译进程完结后,将生成程序的汇编代码test.s,这也是文本文件,内容如下:

// test.c汇编之后的成果test.s

.file "test.c"

.section .rodata

.LC0:

.string "a=%d, b=%d, a+b=%d\n"

.text

.globl main

.type main, @function

main:

.LFB0:

.cfi_startproc

pushl %ebp

.cfi_def_cfa_offset 8

.cfi_offset 5, -8

movl %esp, %ebp

.cfi_def_cfa_register 5

andl $-16, %esp

subl $32, %esp

movl $2, 20(%esp)

movl $3, 24(%esp)

movl 24(%esp), %eax

movl %eax, 4(%esp)

movl 20(%esp), %eax

movl %eax, (%esp)

call add

movl %eax, 28(%esp)

movl 28(%esp), %eax

movl %eax, 12(%esp)

movl 24(%esp), %eax

movl %eax, 8(%esp)

movl 20(%esp), %eax

movl %eax, 4(%esp)

movl $.LC0, (%esp)

call printf

leave

.cfi_restore 5

.cfi_def_cfa 4, 4

ret

.cfi_endproc

.LFE0:

.size main, .-main

.ident "GCC: (Ubuntu 4.8.2-19ubuntu1) 4.8.2"

.section .note.GNU-stack,"",@progbits

3.汇编(Assemble)

汇编进程将上一步的汇编代码极彩娱乐手机板-c言语怎样编译(具体示例)转换成机器码(machine code),这一步发生的文件叫做方针文件,是二进制格局。gcc汇编进程通过as指令完结:

$ as test.s -o test.o

等价于:

gcc -c test.s -o test.o

这一步会为每一个源文件发生一个方针文件。因而mymath.c也需求发生一个mymath.o文件

4.链接(Linking)

链接进程将多个方针文以及所需的库文件(.so等)链接成终究的可履行文件(executable file)。

指令大致如下:

$ ld -o test.out test.o inc/mymath.o ...libraries...

结语

通过以上剖析,咱们发现编译进程并不像幻想的那么简略,而是要通过预处理、编译、汇编、链接。虽然咱们平常运用gcc指令的时分没有关怀中心成果,但每次程序的编译都少不了这几个进程。也不用为上述繁琐进程而烦恼,由于你依然能够:

$ gcc hello.c # 编译

$ ./a.out # 履行

以上便极彩娱乐手机板-c言语怎样编译(具体示例)是c言语怎样编译(具体示例)的具体内容,更多请重视其它相关文章!

更多技巧请《转发 + 重视》哦!

请关注微信公众号
微信二维码
不容错过
Powered By Z-BlogPHP