目录
C编译过程
由.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 $@