目录
一、编译的过程都有哪些
C语言编译过程详解 - CarpenterLee - 博客园
预处理、编译、汇编、链接
预处理:预处理用于将所有的#include头文件以及宏定义替换成其真正的内容,预处理之后得到的仍然是文本文件;
gcc -E -I./inc test.c -o test.i
编译:将程序编译成汇编
gcc -S -I./inc test.c -o test.s
汇编: 将汇编代码转成机器码
as test.s -o test.o
链接: 将多个目标文以及所需的库文件(.so等)链接成最终的可执行文件
ld -o test.out test.o inc/mymath.o ...libraries...
二、程序一定要从main函数开始运行吗?
般程序的入口是__start函数,有两个段:
- .init段:进程的初始化代码,一个程序开始运行时,在main函数调用之前,会先运行.init段中的代码。
- .fini段:进程终止代码,当main函数正常退出后,glibc会安排执行该段代码。
使用-e指定入口函数符号:
ld -static -e nomain -o test test.o
三、make与cmake的区别
CMake是一种跨平台编译工具,比make更为高级,使用起来要方便得多。
CMake主要是编写CMakeLists.txt文件,然后用cmake命令将CMakeLists.txt文件转化为make所需要的makefile文件,最后用make命令编译源码生成可执行程序或共享库(so(shared object))
四、gcc、clang
一个编译器可以按照三段式分为:前段(Fontend)、优化器(Optimizer)、后端(Backend)
CLang是一个由C++编写的编译器前端,能够编译C/C++/Objective等高级语言,属于LLVM的一部分
Clang和GCC的主要区别如下所示。
- Clang比GCC编译用的时间更短
- Clang比GCC的内存占用更小。
- GCC比Clang支持更多的语言,例如Java。
- Clang生成的中间产物比GCC更小。
- Clang的错误提示比GCC更加友好。
- Clang有静态分析,GCC没有。