欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Linux->gcc编译器

程序员文章站 2022-07-14 16:39:07
...

编译的四大步骤

预处理

  • 去掉注释,展开所有代码
gcc -E main -o main.i //-E 成成一个预处理后文件  
                      //-o 将生成的文件放到main.i中
					//main.i中存放main.c包含的头文件
                      

编译

  • 语义语法纠错,将代码解释称为汇编代码,报错将在这一阶段进行
gcc -S main.i -o main.s  //-S 将高级语言(C语言)解释称为汇编代码

汇编

  • 将汇编代码解释成为机器指令代码
gcc -c main.s -o main.o // -c 将汇编代码解释称为机器语言

 

链接

  • 链接代码库以及所有的目标文件,生成可执行程序
  • 头文件:一些常用的功能(函数)的声明,相当于一份菜单
  • 库文件:一些常用的功能(函数)的实现
  • 链接生成可执行程序的时候,需要功能的具体实现,而在编译汇编的时候只需要有功能的声明即可

链接方式:

  • 静态链接:将库中所有文件拷贝到目标文件,并且执行时也会拷贝到内存中
    • 优点:执行时不需要依赖库的存在
    • 缺点:造成大量的代码冗余,占用大量内存
  • 动态链接:如果用到了某个功能,只在目标文件中记录该功能在动态库中的位置符号信息
    • 优点:占用内存少
    • 缺点:所依赖的动态库(运行时库、共享库)必须存在

gcc编译器默认的链接方式是动态库

gcc常用指令

选项 功能
-c 编译、汇编,不链接
-S 编译,不进行汇编和链接
-E 预处理
-v 同时显示编译器的代码
-o 【文件】 将输出输入到指定文件
-x 【语言】 指定语言
–help 显示帮助信息
–version 显示版本信息

下面用一个简单的小程序演示一下:
程序内容:打印“哈哈哈”
Linux->gcc编译器
执行指令(预处理):gcc -E test.c -o test.i
查看test.i:vim test.i
Linux->gcc编译器

执行指令(编译):gcc -S test.i -o test.s
查看test.s:vim test.s

Linux->gcc编译器

执行指令(汇编):gcc -c test.s -o test.o
查看test.o:vim test.o
Linux->gcc编译器

如果需要直接编译成可执行文件则执行指令:gcc test.c -o test
运行test: ./test
Linux->gcc编译器