Linux下程序员均采用gcc控制编译过程,所以我们先从gcc的编译过程讲起
gcc编译过程分为四个阶段:
(1)预处理
(2)编译
(3)汇编
(4)链接
gcc编译工具可以控制在任何阶段停止编译,以下我们便来介绍使用
1.gcc语法格式
gcc 【编译选项】【源文件名】
最常用的选项是 -o 生成可执行文件,如果不指定目标文件名则生成a.out
格式:gcc -o 【目标文件名】 【源文件名】
2.编译过程控制
过程简介:首先是预处理 ,gcc会展开源文件中的宏并向其中插入include包含的内容(生成的文件以 .i 为后缀);
接着将预处理后的源码编译成目标代码(生成的文件以 .o为后缀,对应了上面讲的编译的(2)(3)过程);
最后将目标代码链接成可执行文件(我们通常所说的elf文件,在ubuntu下是绿色的文件);
可通过编译选项的参数控制对应过程
-E:预处理后停止编译(.i文件)
-S:生成源文件的汇编文件(.s文件)
-c:取消链接,生成目标文件(.o文件)
3.关于警告的提示
-Wall:显示所以警告信息
-w:禁止所有警告信息
4.关于库的依赖
先简单介绍以下库的相关知识,Linux下的函数库其实就是一些 .h文件 .so文件(动态链接库) .a文件(静态链接库)的集合。其中.so和.a结尾的文件的最主要差别在于程序执行文件时所需要的代码是动态加载还是在编译时静态加载,默认编译采用的是动态链接,可以通过-shared和-static分别指定是生成动态链接库还是静态链接所需要的库。
Linux下的默认库搜索路径有/lib、/usr/lib、/usr/lib/local/,当我们进行开发时需要添加第三方库时就需要添加一些头文件或者库文件,这些都可以在编译的时候通过编译选项指定,下面我们就来介绍
-I【目录名】:将指定的目录添加到程序头文件搜索的目录中(大写的i,include的意思)
-L【目录名】:向gcc库文件搜索路径中添加新的目录
-l【库名】:包含指定的库(小写的l,lib的意思)
5.实例演示
以hello.c为例子
6.代码优化
编译选项-O【n】(n取值范围0,1,2,3 数值越大优化级别越高,-O等价-O1)可以优化编译,我们采用time命令测试运行时间来举例说明