1.gcc安装
在终端输入:sudo apt-get install gcc
就可以安装gcc编译器了。
2.gcc遵循的约定:
3.gcc的选项参数:
4.gcc的编译过程:
第一步,预处理,
在预处理阶段,gcc会把预处理的命令扫描并处理完毕(头文件、宏定义、宏函数),该阶段会生成.i的文件
gcc -E 文件名.c -o 文件名.i
gcc -o 文件名.i -E 文件名.c
gcc -E -o 文件名.i 文件名.c
gcc -o 文件名.i 文件名.c -E
其中-o后面要跟文件名+.i
第二步,编译阶段,
在编译阶段,gcc把预处理结果编译成汇编或目标模块,生成.s文件
gcc -S 文件名.c -o 文件名.s
gcc -o 文件名.s -S 文件名.c
gcc -S -o 文件名.s 文件名.c
gcc -o 文件名.s 文件名.c -S
第三步,汇编,
在汇编阶段,编译器把编译出来的结果生成具体的CPU上的目标代码,生成.o文件
gcc -C 文件名.c -o 文件名.o
gcc -o 文件名.o -C 文件名.c
gcc -C -o 文件名.o 文件名.c
gcc -o 文件名.o 文件名.c -C
第四步,链接,
在链接阶段,将一个个生成的.o文件,链接起来生成可执行文件,在Windows上是.exe,Linux上是.out
gcc test.o -o test
gcc -o test.c test.o
gcc -o test test1.c test2.c test3.c
gcc test1.c test2.c test3.c -o test2
5.各阶段的常用参数:
编译,
多文件:系统默认按照源文件,生成对应的.s文件
gcc -S test1.c test2.c test3.c
gcc test1.c test2.c test3.c -S
汇编,
多文件:
gcc -c test.c test1.c test2.c
gcc test.c test1.c test2.c -c
生成可执行程序,
多文件:
生成.o文件
gcc -o test.c test1.c test2.c
gcc test.c test1.c test2.c -o
生成可执行文件,gcc test1.c test2.c test3.c
包含调试信息,
1.无调试信息
gcc test.c test1.c -o test
2.有调试信息,程序会变大
gcc test.c test1.c -o test -g
6.代码优化:
编译时使用选项-0可以告诉gcc同时减小代码的长度和执行时间,其效果等价于-01。
在这个级别. 上能够进行的优化类型虽然取决于目标处理器,但一般都会包括线程跳(Thread Jump)和延迟退栈(Deferred Stack Pops)两种优化。
选项-02告诉gcc除了完成所有-01级别的优化之外,同时还要进行一些额外的调整工作,如处理器指令调度等。
选项-03则除了完成所有-O2级别的优化之外,还包括循环展开和其它- -些 与处理器特性相关的优化工作。通常来说,数字越大优化的等级越高,同时也就意味着程序的运行速度越快。
许多Linux程序员都喜欢使用-O2选.项,因为它在优化长度、编译时间和代码大小之间,取得了比较理想的平衡点。
默认无优化
gcc test.c -o test
调整为o2优化
gcc test.c -o test1 -o2
注:我们可以用
time ./test
time ./test1来看优化结果
7.警告:
gcc有很多编译选项,警告选项:指定头文件、库路径;优化选项。
默认级别是编译器认为的警告,满足大部分场合使用
(1) 显示更多警告wall
方便检查代码的安全性
(2)发生第一个错误中止编译 Wfatal-errors
(3)关闭警告 -w(不要使用)
(4)警告转换为错误 Werror
8.检查是否符合C语言标准:使用-pedantic命令
9.程序库:
程序库
什么是库
在 windows 平台和 Linux 平台下都大量存在着库。
本质上来说库是 一种可执行代码的二进制形式,可以被操作系统载入内存执行。
由于 windows 和 linux 的平台不同(主要是编译器、汇编器和连接器 的不同),因此二者库的二进制是不兼容的。
linux 下的库有两种:静态库和共享库(动态库)。
二者的不同点在于代码被载入的时刻不同。
静态库的代码在编译过程中已经被载入可执行程序,因此体积较大。
静态用.a为后缀, 例如: libhello.a
共享库(动态库)的代码是在可执行程序运行时才载入内存的,在编译过程中仅简单的引用,因此代码体积较小。
动态通常用.so为后缀, 例如:libhello.so
共享库(动态库)的好处是,不同的应用程序如果调用相同的库,那么在内存里只需要有一份该共享库的实例。
创建和使用静态库
ar rcs libname.a file1.o file2.o
ar -rcs libname.a file1.o file2.o
表示要把目标码file1.o和file2.o加入到静态库libname.a中。只有那么是可以修改的,其他是固定的。
步骤:
1.创建add.c
2.生成add.o
3.生成libname.a静态库文件
4.创建main.c,调用库文件
gcc main.c libfun.a -o main
使用选项-I指定头文件路径
gcc main.c lib/libname.a -I ./inc/