from:
http://blog.csdn.net/jyjmc/article/details/5278130
At first, GCC is used for GNU C Compiler. At present,it supports JAVA Ada C++ and so on.
GCC编译流程分为:
1.Pre-Processing(预处理)
gcc -E -o hello.i hello.c
选项-E 使得编译器在预处理结束时停止编译
选项-o 指定GCC的输出结果
.i/.ii 经过预处理的C/C++源程序
2.Compiling(编译)
gcc -S -o hello.s hello.i
选项-S 使得编译器在编译结束,进行汇编之前停止编译
.s 汇编语言源程序
3.Assembling (汇编)
gcc -c hello.s hello.o
选项-c 汇编阶段将汇编代码转为二进制目标代码
4.Linking(链接)
gcc hello.o -o hello
将程序中用到的
库函数如printf的实现从默认的路径"/usr/lib/libc.so.6"链接过来
现在即可运行可执行文件hello
GCC警告提示:
1.Wall类警告提示
占GCC警告选项90%以上,建议使用
选项-Wall,即打开所有警告:
gcc -Wall wrong.c -o wrong
2.非Wall类警告提示
"-ansi" 强制GCC生成的标准语法所要求的告警信息,并
不保证所有没有警告的程序都是符合ANSI C标准
”-pedantic“ 允许发出ANSI C标准所列的全部警告信息,
保证所有没有警告的程序都是符合ANSI C标准
gcc -pedantic wrong.c -o wrong
GCC使用库函数
Linux中有3种库函数形式:
1.静态 后缀为
.a
静态库的代码在
编译时就已经连接到应用程序中
2.共享 后缀为
.so和版本号
在程序
开始运行时才载入
3.动态 后缀为
.so和版本号
在程序中的语句
需要使用该函数时才调用,调用结束后释放动态库所占内存
动态库和共享库只包含对库函数的
引用,代码规模较小
Linux系统所用的库都放在
/usr/lib 和
/lib 目录下
库文件的路径通常不在系统默认路径下,则需要使用
调用路径选项来指定相关库文件的位置
1. ”
-I dir “ 在头文件的
搜索路径列表中添加 dir 目录
若"/root/workplace/gcc"下包括hello.h , hello.c:
"# include
..."
gcc hello.c -I /root/workplace/gcc -o hello
<>表示在系统默认路径中搜索头文件,采用#include ”hello.h“则不用加 -I选项
2. ”-L dir“ 与-I dir类似,区别在于”-L“指明库文件的路径
dir中不能包括文件名,只是指定了路径
使用3种类型链接库
用选项”-l“(小写的L)加库名称,如libm.a或libm.so 在调用时都写作”-lm“
Linux系统默认采用动态链接的方式 ,若动态静态库重名,则需要显示包含后缀"-llibm.a"
GCC代码优化: -On选项 n常取0~3 n越大优化工作越多
优化选项可以加速代码运行速度,但加大调试难度。一般在最终release的时候考虑优化
以上为《嵌入式LinuxC编程入门(第二版)》ISBN 978-7-115-21281-8 学习整理