嵌入式linux 命令行退出应用程序,嵌入式Linux C编程 01

0262cdbfbcf9a4d52fd1ee766977dfca.png

f452980bd89853f8ff803410bbc5d63d.png

426d10b86ba69f4ded2cf4345b63f24a.png

5c3db42f8254411acb9f92bde43a7c1d.png

预处理(Pre-Processing)

编译(Compiling)

汇编(Assembling)

链接(Linking)

6f4d59fbaab29354b4cd958c809e28a6.png

1.3.2 GCC编译流程分析

gcc [option | filename]

1、预处理阶段

gcc -E -o [目标文件] [编译文件]

gcc -E -o hello.i hello.c

2、编译阶段

gcc -S -o hello.s hello.i

3、汇编阶段

gcc -c hello.s -o hello.o

4、链接阶段

gcc hello.o -o hello

1.3.3 GCC警告提示

分为Wall类 和 非Wall类

1.3.4 GCC使用库函数

静态库(.a) 和 动态库(.so和版本号组成)。库都存放在/usr/lib 和 /lib 目录中

例如:libm.so.5 标识符为m,版本号为 5,

2、相关路径选项

1) -I

改变搜索路径

gcc hello.c -I/root/workspace/gcc/ -o hello

2) -L

用于指明库文件的路径。

例如:程序hello_sq.c需要用到目录“/root/workspace/gcc/lib”下的一个动态库libsunq.so,则

gcc hello_sq.c -L/root/workspace/gcc/lib -lsunq -o hello_sq

“-I

3、使用不同类型链接库

选项“-l”(小写的L),用于指定具体使用的库文件。库都是以“lib”开头,只需填写lib之后的内容。

如果libm.a和libm.so同时存在,默认链接共享库。写作“-lm”即可

如果选用静态库,则在“-l”之前添加选项“-static”。例如,链接libm.a库文件的选项是“-static -lm”。

1.3.5 GCC代码优化

编译选项 -On 控制优化代码的生成,其中n是一个代表优化级别的整数。比较典型的范围是从0到2或3。

优化选项-O 主要进行线程跳转(Thead Jump)和延迟退栈(Deferred Stack Pops)两种优化。

优化之后,难于调试。

1.4 调试器GDB的使用

功能:

能够运行程序,设置所有能影响程序运行的参数

能够让程序在指定的条件下停止运行

能够在程序停止时检查所有参数的情况

能够根据指定条件改变程序的运行

1.4.1 GDB使用实例

#include

void add(int m)

{

int i,n = 0;

for (i = 1; i <= m; i++)

{

n += i;

}

printf("The sum of 1-%d in add is %d\n", m, n);

}

int main()

{

int i,n = 0;

add(50);

for (i = 1; i <= 50; i++)

{

n += 1;

}

printf("The sum of 1-50 is %d \n", n);

}

编译时要加上“-g”选项。

1、进入GDB

#gdb test

2、查看文件

“l”(list)查看程序的源码

3、设置断点

在 “b” 后加入对应的行号即可

(gdb) b 6

4、查看断点处情况

(gdb) info b

5、运行代码

GDB默认从首行开始运行代码,键入“r”(run)即可

6、查看变量值

“p 变量值”

(gdb) p n

$1 = 0

(gdb) p i

$2 = 1345

“$N”标记,当前变量值的引用标记。

7、观察变量

在某循环处,“watch”来观察变量的变化情况

(gdb) watch n

8、单步运行

“n”(next)即可

9、程序继续运行

“c”(continue)继续运行,直到遇到断点或程序结束

10、退出GDB

“q”(quit)即可退出

1.4.2、设置/删除断点

07ac0bf6937451f4c98290b6fdad704c.png

1.4.3、数据相关命令

9c1690ae680b5086b2754baa4785f4b5.png

1.4.4、调试运行环境相关命令

841ad9dae828baed219b4e606c9f5ea0.png

1.4.5、堆栈相关命令

93bf156e08ad728d08388335b001d025.png

1.5.1、Makefile基本结构

Makefile是make读入的唯一配置文件。

通常包含如下内容:

需要由make工具创建的目标体(target),目标体通常是目标文件、可执行文件或是一个标签。

要创建的目标体所依赖的文件(dependency_file)。

创建每个目标体时需要运行的命令(command)。

格式为:

target: dependency_files

/t command

#The simplest example

hello.o: hello.c hello.h

/t gcc -c heelo.c -o hello.o

接着就可以使用make了。使用make的格式为:make target,这样make就会自动读入Makefile执行对应target的command语句,并会找到相应的依赖文件。

#make hello.o

gcc -c hello.c -o hello.o

#ls

hello.c hello.h hello.o Makefile

在Makefile中的每一个command前必须有“Tab”符。

1.5.2、Makefile变量

定义的名字,用来代替一个文本字符串,该文本字符串称为该变量的值。

变量的值可以用来代替目标体、依赖文件、命令及Makefile文件中的其他部分。在Makefile中的变量定义有两种方式:一种是递归展开方式,另一种是简单方式。

递归展开方式定义的变量是在引用该变量时进行替换的,即如果该变量包含了对其他变量的引用,则在引用该变量时一次性将内嵌的变量全部展开。

简单扩展型变量的值在定义处展开,且只展开一次,消除了变量的嵌套引用。

递归展开方式的定义:VAR=var

简单扩展方式的定义:VAR:=var

make中变量的使用格式为:$(VAR)

变量名是大小写敏感的。推荐使用小写字母

Makefile中的变量分为用户自定义变量、预定义变量、自动变量及环境变量。

预定义变量包含了常见编译器、汇编器的名称及编译选项。

987eea1238fa223c8d6a333b9837ad17.png

CC=gcc

testgdb01.o: testgdb01.c testgdb01.h

$(CC) -c testgdb01.c -o testgdb01.o

clean:

$(RM) testgdb01.o

自动变量通常可以代表编译语句中出现的目标文件和依赖文件等,并且具有本地含义。

0d42224c2c24661e4f8e877727c8e464.png

make在启动时会自动读取系统当前已经定义了的环境变量,并且会创建与之具有相同名称和数值的变量。

1.5.3、Makefile规则

Makefile的规则包括目标体、依赖文件及其间的命令语句,是make进行处理的依据。Makefile中的一条语句就是一个规则。

make还定义了隐式规则和模式规则。

1、隐式规则

隐式规则能够告诉make怎么使用传统的技术完成任务。

隐式文件只能查找相同文件名的不同扩展名文件。

b1bddfb5e5b6a14365f1bd36571953b1.png

2、模式规则

隐式规则仅仅能够用make默认的变量来进行操作。

模式规则是用来定义相同处理规则的多个文件的,模式规则能引入用户自定义变量,为多个文件建立相同的规则,简化Makefile的编写。

模式规则的格式类似于普通规则,这个规则中的相关文件前必须用“%”标明。

1.5.4、make使用

直接运行make,则建立Makefile中的第一个目标。

e99f00c15eb94c8747a6c6e45d84cba5.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值