嵌入式Linux——C编程基础

简单记录了gcc、gdb、make的常用指令
由.c文件到.i文件,这个过程叫预处理
由.i文件到.s文件,这个过程叫编译
由.s文件到.o文件,这个过程叫汇编
由.o文件到可执行文件,这个过程叫链接

gcc编译

gcc编译常用选项

-c    #只编译不链接,生成目标文件.o
-S    #只编译不汇编,生成汇编代码
-E    #只进行预编译,不做其他处理
-g    #在可执行程序中包含标准调试信息
-o    #file #将file文件指定为输出文件
-v    #打印出编译器内部编译各过程的命令行信息和编译器的版本
-I dir    #在头文件的搜索路径列表中添加dir目录

gcc编译库选项

-static    #进行静态编译,即链接静态库,禁止使用动态库
-shared    #动态编译,尽可能生成动态库(默认)
-L dir    #在库文件的文件夹搜索列表中添加dir
-lname    #链接名为name的动/静态库
-fpic    #生成使用相对地址的位置无关的代码

gcc警告和出错选项

-ansi    #支持符合ANSI的标准程序
-padansi    #允许发出ANSI C标准列出的全部警告信息
-padansi-error    #允许发出ANSI C标准列出的全部错误信息
-w    #关闭所有警告
-Wall    #允许gcc发出所有有用的报警信息
-werrro    #把所有警告信息转化为错误信息

gdb调试

进入gdb调试

gcc -g test.c -o test    #使可执行文件中包含调试信息
gdb test    #开始调试

gdb调试命令

help    #查看帮助
l    #list
p var   #print 查看变量值
r    #run 运行代码
b [断点]   #breakpoint 在第6行设置断点
info [断点]    #查看断点
d [断点]    #delete 删除断点
disable [断点]    #停用断点
enable [断点]    #启用断点
bt    #backrace 查看调用函数的情况
n    #next 单步运行,会进入函数调用
s    #step 单步运行,不会进入函数
c    #continue 继续运行
condition [断点] [条件表达式]   #修改断点条件
ignore [断点] [次数]    #忽略断点n次
finish    #运行程序,直到函数完成返回

make 工程管理器

make 命令行选项

-C dir 读入指定目录下的 makefile
-f file 读入当前目录下的 file 文件作为 makefile
-I 忽略所有的命令执行错误
-I dir 指定被包含的 makefile 所在目录
-n 只打印要执行的命令,但不执行这些命令
-p 显示 make 变量数据库和隐含规则
-s 在执行命令时不显示命令
-w 如果 make 在执行过程中改变目录,则打印当前目录名

make 文件基本结构

target : dependency_files
    command //必须以TAB键开头

例如

hello.o : hello.c hello.h
    gcc -c hello.c -o hello.o

更一般化的makefile($变量)

OBJS = kang.o yul.o 
CC = gcc 
CFLAGS = -Wal1 -O -g 
david : $ (OBJS)
    $ (CC) $ (OBJS) -o david 
kang.o : kang.c kang.h
    $ (CC) $ (CFLAGS) -c kang.C -o kang.o 
yul.o : yul.c yul.h
    $ (CC) (CFLAGS) -c yul.c -o yul.o

预定义变量

AR 库文件维护程序的名称,默认值为 ar
AS 汇编程序的名称,默认值为 as
CC C 编译器的名称,默认值为 cc
CPP C 预编译器的名称,默认值为$(CC) –E
CXX C++编译器的名称,默认值为 g++
FC Fortran 编译器的名称,默认值为 f77
RM 文件删除程序的名称,默认值为 rm –f
ARFLAGS 库文件维护程序的选项,无默认值
ASFLAGS 汇编程序的选项,无默认值
CFLAGS C 编译器的选项,无默认值
CPPFLAGS C 预编译的选项,无默认值
CXXFLAGS C++编译器的选项,无默认值
FFLAGS Fortran 编译器的选项,无默认值

自动变量

$* 不包含扩展名的目标文件名称
$+ 所有的依赖文件,以空格分开,并以出现的先后为序,可能包含重复的依
赖文件
$< 第一个依赖文件的名称
$? 所有时间戳比目标文件晚的依赖文件,并以空格分开
$@ 目标文件的完整名称
$^ 所有不重复的依赖文件,以空格分开
$% 如果目标是归档成员,则该变量表示目标的归档成员名称

makefile规则

隐式规则

所有.o文件都可自动由.c文件使用命令$(CC) $(CPPFLAGS) $(CFLAGS) -c file.c –o file.o来生成

C 编译:.c 变为.o
$(CC) –c $(CPPFLAGS) $(CFLAGS)
C++编译:.cc 或.C 变为.o
$(CXX) -c $(CPPFLAGS) $(CXXFLAGS)
Pascal 编译:.p 变为.o
$(PC) -c $(PFLAGS)
Fortran 编译:.r 变为-o
$(FC) -c $(FFLAGS)

模式规则

%.o : %.c
    $(CC) $(CFLAGS) -c $< -o $@

发表评论

您的电子邮箱地址不会被公开。