嵌入式开发c语言的案例(嵌入式开发-C语言高级编程-)
嵌入式开发c语言的案例(嵌入式开发-C语言高级编程-)1、预处理(Pre-Processing) 源文件.c 生成.i 2、编译(Compiling) 文件.i生成.s 3、汇编(Assembling) 文件.s生成.o 4、链接(Linking) 文件.o生成可执行程序.exe例:分析器:将源代码转换为汇编语言 汇编器:汇编语言转换为CPU可以执行的字节码 链接器: 标准C库:核心基本用法GCC最基本的用法:gcc [options] [filenames] -c 只编译,不连接成可执行的文件 -o output filename 确定输出文件名称为 output filename 同时这个名称不能和源文件同名 -g 产生符号调试工具(GND的gdb)所必要的符号资讯,要对源代码进行调试,必须加入这个选项 -O 对程序进行优化编译、连接、采用这个选项 -O2 比-O更好的优化编译,连接,编译速度慢 -I d
GNU工具
-编译工具: 把一个源程序编译为一个可执行程序
-调试工具:能对执行程序进行源码或汇编级调试
-软件工程工具:用于协助多人开发或大型软件项目管理,如make CVS subvision
-其他工具:用于把多个目标文件链接成可执行文件的链接器,或都用作格式转换的工具
1、GCC编译器
简介
全称为GNU CC,GNU项上中符合ANSI C标准的编译系统
编译如C、C 、Object、C 、JAVA...
GCC 是可以在多种硬件平台上编译出可执行程序的超级编译器,其执行效率与一般的可编译器相比平块效率高20%以上
一个交叉平台编译器,适合在嵌入式领域的开发编译。
所支持后缀
- .c C原始程序
- .C/.cc/.cxx C 原始程序
- .m Objective-C原始程序
- .i 已经处理过的C原始程序
- .ii 已经处理过的C 原始程序
- .s/.S 汇编语言原始程序
- .h 头文件
- .o 目标文件
- .a/.so 库文件
编译器的主要组件
分析器:将源代码转换为汇编语言
汇编器:汇编语言转换为CPU可以执行的字节码
链接器:
标准C库:核心
基本用法
GCC最基本的用法:gcc [options] [filenames]
-c 只编译,不连接成可执行的文件
-o output filename 确定输出文件名称为 output filename 同时这个名称不能和源文件同名
-g 产生符号调试工具(GND的gdb)所必要的符号资讯,要对源代码进行调试,必须加入这个选项
-O 对程序进行优化编译、连接、采用这个选项
-O2 比-O更好的优化编译,连接,编译速度慢
-I dirname 将dirname所指出的目录加入程序头文件目录列表中
-L dirname 将dirname所指出的目录加入到程序函数档案库文件的目录列表中
常见错误
一、C语法错误
-错误信息:文件source.c中第几行有语法错误(syntex error)
二、头文件错误
-找不到头文件head.h(Can not find include file head.h)
三、档案库错误
-链接程序找不到所需的函数库(ld:-lm: No such file or directory)
四、未定义符号
-有未定义的符号(Undenfined symbo1)
编译过程
1、预处理(Pre-Processing) 源文件.c 生成.i
2、编译(Compiling) 文件.i生成.s
3、汇编(Assembling) 文件.s生成.o
4、链接(Linking) 文件.o生成可执行程序.exe
例:
#include <stdio.h>
#include <math.h>
#define N 10
#define _DEBUG_
int main(){
double m =615 n;
m =N;
n = sqrt(m);
#ifdef _DEBUG_
printf("debug:m=%lf n=%lf\n" m n);
#else
printf("release:m=%lf n=%lf\n" m n);
#endif
return 0;
}
gcc -E gccdemo.c -o gccdemo.i 输出.i
gcc -o gccdemo gccdemo.c -lm
2、GDB调试工具
首先使用gcc对test.c进行编译,注意一定要加上选项 -g
gcc - test.c -o test
l 查看文件
b 6 设置断点
del 1 删除断点
info b 查看断点情况
p n 查看变量值
n s 单步运行
c 恢复程序运行
help 帮助
q 退出调试
set 参数 设置输入参数