嵌入式Linux C语言开发工具
学习+复习~
1、编辑器vi
- (1)vi的删除、修改与复制命令
- (2)vi中光标移动的命令
- (3)vi的查找与替换命令
- (4)vi的文件操作指令
2、编译器GCC
- (1)GCC所支持扩展名解释
- (2)GCC编译流程分析
预处理阶段:
gcc -E -o hello.i hello.h /*选项“-o”是指定要生成的文件*/
编译阶段:
gcc -S -o hello.s hello.i /*“.s”代表汇编语言源程序*/
汇编阶段:
gcc -c hello.s -o hello.o /*“.o”代表二进制目标代码*/
链接阶段:
gcc hello.o -o hello /*选项“-o”是指定GCC输出的结果*/
- (3)GCC警告提示
GCC的警告提示选项有很多种类型,主要可分为Wall类和非Wall类。
GCC的Wall类警告提示选项:
gcc -Wall hello.c -o hello
非Wall类的警告提示:
非Wall类的警告提示中最为常用的两种是“-ansi”和“-pedantic”。
gcc -ansi hello.c -o hello /*该选项强制GCC生成标准语法所要求的告警信息*/
gcc -pedantic hello.c -o hello /*该选项允许发出ANSI C标准所列的全部警告信息*/
- (4)GCC使用库函数
- Linux中函数库包括两类:静态库(扩展名为.a)和共享库(扩展名由.so和版本号组成)。
gcc hello.c -I<dir> -o hello /*-I<dir>选项可以在头文件的搜索路径列表中添加<dir>目录*/
/*“#include <my.h>”改为“#include"my.h"”,这样就不需要加上“-I”选项了*/
- 使用选项“-l”(注意是小写的“L”)指明具体使用的库文件,由于在Linux中函数库的命名规则都是以“lib”开头的,因此,这里的库文件只需填写lib之后的内容即可。
gcc -o dynamic -L /root/lq/testc/lib/dynamic.o -lmydynamic
/*若系统中同时存在库名相同的静态库文件和共享库文件时,GCC默认链接的是共享库。如果要链接同名静态库,则在“-l”之前添加选项“-static”。如链接libm.a库文件的选项是“-static -lm”*/
4、调试器GDB
(1)常用基础命令
- 进入GDB:输入【gdb 调试的可执行文件名】
- 查看文件:键入【l】(list)查看程序的源码
- 设置断点:输入【b 行号】,利用行号设置断点是指代码运行到对应行之前暂停
- 查看断点处情况:键入【info b】查看断点设置情况
- 运行代码:输入【r】
- 查看变量值:输入【p 变量名】查看断点处变量值。
- 观察变量:输入【watch 变量名】观察一个变量的变化情况
- 单步运行:键入【n】(next)
- 程序继续运行:输入【c】(continue)使程序继续往下运行,直到再次遇到断点或程序结束
- 退出GDB:键入【q】(quit)
(2)GDB中常见断点设置与删除指令
(3)GDB中数据相关指令
- 在使用print命令时,可以对变量按指定格式进行输出,其命令格式为:print /变量名+格式。
- x,十六进制;d,十进制;u,无符号数;o,八进制;c,字符格式;f,浮点数。
(4)GDB调试运行环境相关命令
(5)GDB中堆栈相关命令
5、make工程管理器
make是一个自动编译管理器,能够根据文件时间戳自动发现更新过的文件从而减少编译的工作量。它通过读入Makefile文件的内容来执行大量的编译工作,用户只需一次编写简单的编译语句即可。
(1)Makefile基本结构
Makefile用来告诉make如何编译和连接一个程序,是make读入的唯一配置文件。一个Makefile中通常包含:
- 需要由make工具创建的目标体(target),目标体通常是目标文件、可执行文件或是一个标签。
- 要创建的目标体所依赖的文件(dependency_file)
- 创建每个目标体时需要运行的命令(command)
target: dependency_files
command
/*The simplest example*/
hello.o: hello.c hello.h
gcc -c hello.c -o hello.o
clean :
rm hello.o
/*在Makefile中的每一个command前必须有“Tab”符,否则在运行make命令时会出错。*/
注意
- 使用make的格式为:【make target】。make会自动读入Makefile(也可以是首字母小写makefile)执行对应target的command语句,并会找到相应的依赖文件。
- clean不是一个文件,它只不过是一个动作名称,也可称其为标签,不依赖于其他任何文件,使用【make clean】执行。用户可以通过这种方法在一个Makefile中定义一些和编译无关的命令,比如程序的打包、备份或删除等。
(2)Makefile变量
- 变量是在Makefile中定义的名字,用来代替一个文本字符串,该文本字符串称为该变量的值。变量的值可以用来代替目标体、依赖文件、命令及Makefile文件中的其他部分。
- 在Makefile中的变量定义有两种方式:一种是递归展开方式,另一种是简单方式。递归展开方式的定义格式为:VAR=var。简单扩展方式的定义格式为:VAR:=var。
- 简单示例:
- 预定义变量包含了常见编译器、汇编器的名称及编译选项。Makefile中常见预定义变量:
- 自动变量通常可以代表编译语句中出现的目标文件和依赖文件等,并且具有本地含义(即下一语句中出现的相同变量代表的是下一语句的目标文件和依赖文件)。Makefile中常见自动变量:
(3)Makefile规则
Makefile中的一条语句就是一个规则,Makefile的规则包括目标体、依赖文件及其间的命令语句。
- 隐式规则:不必详细指定编译的具体细节,只需把目标文件列出即可。make会自动搜索隐式规则目录来确定如何生成目标文件。注意:隐式规则只能查找到相同文件名的不同扩展名文件,如“kang.o”文件必须由“kang.c”文件生成。
利用隐式规则简化后:
- Makefile中常见隐式规则目录:
- 模式规则:用来定义相同处理规则的多个文件,能引入用户自定义变量,为多个文件建立相同的规则,简化Makefile的编写。
- make的命令行选项:
6、test
/*test.c*/
#include <stdio.h>
#include <stdlib.h>
int x=0;
int y=5;
int fun1()
{
extern p, q;
printf("p is %d, q is %d
", p, q);
return 0;
}
int p=8;
int q=10;
int main()
{
fun1();
printf("x is %d, y is %d
", x, y);
}
- gcc编译,运行结果:
- 自行编写Makefile,运行结果: