GNU is Not Unix
目标: 开发出完全免费的开发系统
gcc
GNU C Compiler
编译过程分为4个阶段
预处理(Pre-Processing)
编译(Compiling)
汇编(Assembling)
链接(Linking)
文件类型
后缀名 | 文件类型 |
---|---|
.c | c语言源代码文件 |
.C,cc,.cxx | C++源代码文件 |
.h | 头文件 |
.a | 由目标文件构成的库文件 |
.i | 已经经过预处理的C源代码 |
.ii | 已经经过预处理的C++源代码 |
.o | 编译后的目标件 |
.s | 汇编语言源代码文件 |
.S | 经过预编译后的汇编语言源代码文件 |
指令
gcc [options] [filenames]
[option] : 编译选项 | 含义 |
---|---|
-o 目标文件名 | 加在filenames 后 为 生成的目标文件的名 若不加 默认为 a.out |
-c | 只编译 不编译生成可执行文件 只生成到 .o 的目标文件 |
-g | 产生gdb调试工具所必要的符号信息 |
-O | 对程序进行优化编译、链接 |
-O2 | 比-O 更好的优化 |
-I(dirname) 目录名 | 将做指出的目录加入到程序头文件目录列表中#include<A.h> 在系统预设的头文件目录中寻找(如 /usr/include)#include"B.h" 在当前目录下寻找头文件 |
L(dirname) 目录名 | 将做指出的目录加入到程序库文件目录列表中默认情况下 在系统能够预设目录下寻找如(/usr/lib) |
l(name) 库名 | 加载制定库 如 库名为 libm.a 只需写作 m |
-static | 静态链接库文件 动态库后缀为.so 静态库后缀为 .a |
-Wall | 生成所有警告信息 |
-w | 不生成任何警告信息 |
-DMACRO | 定义宏 等效于程序中写了 #define MACRO |
运行
./执行文件名 执行当前目录下的可执行文件
time./执行文件名 显示运行时间的执行方案
GDB
指令
gdb 调试程序名 启动gdb 调试程序
gdb 启动gdb
助记符 | 含义 |
---|---|
file 调试程序名 | 启动调试程序 |
l(ist) | 查看程序 |
b(reak) 函数名/行数/文件名:行号 | 设置断点 |
b(reak)行号 if 条件 | 当条件位真时,指定断点生效 |
info break | 查看所有断点 |
delete 断点编号 | 删除断点 |
r(un) | 开始运行程序 |
n(ext) | 单步运行程序 (不进入子函数) |
s(tep) | 单步运行程序 (进入子函数) |
c(ontinue) | 继续运行程序 |
finish | 运行程序,知道当前函数结束 |
p(rint) 变量名 | 查看制定变量值 |
watch 变量名 | 对指定变量进行监控 |
q(uit) | 退出gdb |
Makefile
格式 :
target(目标):prerequisites(依赖文件)
command(命令)
.PHONY : targets
targets:`command
变量
例程:
obj=main.o func1.o
hello:
(obj)gcc
(obj) -o hello
默认变量
$^ 代表所有的依赖文件
$@ 代表目标
$< 代表第一个依赖文件
@命令前加 取消回显
第一行目标为最终目标 一个makefile文件只有一个最后目标 完成即释放
命令行行需要tab键起始
无依赖度目标 需加伪指令.PHONY
指令
make -f 文件名 未制定 默认文件名为makefile 或Makefile