GCC
在linux平台上,最流行的编译系统是GCC。GCC也是GNU发布的最著名软件之一。GCC的功能非常强大,主要体现在两方面。
(1)GCC可以为X86、ARM、MIPS等不同体系结构的硬件平台编译程序。
(2)GCC可以编译C、C++、JAVA、Pascal等数十种不同的高级语言。
gcc命令的使用格式格式为:
gcc [选项] [ 文件名] [选项] [文件名]
gcc命令拥有数量庞大的编译选项,按类型可以把选项分为以下几大类。
(1)总体选项:控制编译的整个流程
常用选项:
-E 对源文件进行预处理(进行头文件展开等工作)
-S对文件进行编译(进行语法检查(检查单词拼写以及语句语法,语义是否正确)并将文件转为汇编语言)
-c对文件进行汇编(或编译)(将文件翻译成CPU可识别的二进制文件)
-ofile 输出目标文件file
-v显示编译阶段的命令
(2)语言选项;用于支持各版本的C语言程序。
常用选项:
-ansi:支持符合ANSI标准的C语言程序
(3)警告选项:用于控制编译过程中产生的各种警告信息
常用选项:
-W屏蔽所有的警告信息
-Wall显示所有类型的警告信息
-Werror出现任何警告信息就停止编译
( 4 )调试选项:用于控制调试信息。
常用选项:
-g 产生调试信息
( 5 )优化选项:用于对目标文件进行优化
常用选项:
-01 对目标文件的性能进行优化
-02 在-01的基础上进一步优化,提高目标文件的运行性能
-03 在-02的基础上进一步优化,支持函数集成优化
-00 不进行优化
( 6 )连接器选项:用于控制链接过程
常用选项:
-static 使用静态链接
-l(Library) 链接Library函数库文件
-L(dir)指定连接器的搜索目录dir
-shared 生成共享文件
( 7 )目录选项:用于指定编译器的文件搜索目录
常用选项:
-I(dir)指定头文件的搜索目录
-L dir 指定都所目录dir
GCC工作流程
在C程序的编译过程中,依次要进行预处理、编译、汇编、连接四个阶段。1。1. 预处理阶段—展开头文件
2.编译阶段—三步骤
(1)词法分析:主要负责检查关键字、标识符等是否正确。
(2) 语法分析:主要负责检查程序中语句的语法是否正确(3) 语义分析:主要负责检查程序中语句的逻辑意义是否正确
3.汇编阶段—把汇编程序翻译成CPU可以识别的二进制文件
4.连接阶段—将test.o文件和所需的库文件连接起来
Glibc
Glibc是GNU推出的C语言函数库,其中包含了大量的函数库,其中,libc是最基本的函数库,每个C程序都要实用libc库,此外常用的还有数学库libm、加密库libcryp、POSIX线程库libpthread等.
C程序在调用Glibc中的函数库时,需要引用与函数库对应的头文件,同时在编译命令中需要加入某些函数库的链接参数,并使用符号-l进行连接,比如函数库libm的链接参数为m等,如:
gcc 选项 文件名 选项 文件名 -lm
Glibc一般分布在/lib和/usr/lib目录下,其中/lib目录下的函数库文件主要是给/bin目录下的系统程序使用的,而/uer/bin目录中的函数库文件主要是给/usr目录下的用户程序使用的。函数库文件后缀不同,其性质也不同:
a : 静态库文件
la :用来记录库文件信息的动态库文件
so :动态库文件
使用动态链接方式i编译程序时,动态库的符号链接文件会写入二进制文件中,这样,程序在运行时就可以通过符号链接找到指定的动态库文件了。
通过选项-static可以使用静态链接方式对程序进行编译(例: gcc -static test.c -o test)