义乌市场官方网站,杭州网络公司,科技自主自强国家发展战略,珠海网站建设本篇博客详细分析#xff0c;Linux平台上C程序的编译过程与调试方法#xff0c;这也是我们后续程序开发的基础。
目录
一、第一个hello world程序
1.1 创建.c文件
1.2 编译链接 运行可执行程序
二、编译链接过程
2.1 预编译阶段
2.2 编译阶段
2.3 汇编阶段
2.4 链… 本篇博客详细分析Linux平台上C程序的编译过程与调试方法这也是我们后续程序开发的基础。
目录
一、第一个hello world程序
1.1 创建.c文件
1.2 编译链接 运行可执行程序
二、编译链接过程
2.1 预编译阶段
2.2 编译阶段
2.3 汇编阶段
2.4 链接阶段
三、gcc 分步编译链接
3.1 一步完成编译链接生成可执行程序
3.2 分两步完成编译链接生成可执行程序
3.3 多文件编译链接
四、 make工具和makefile文件
4.1 什么是make和makefile
4.2 利用make工具完成上一小节的自动化编译过程
4.2.1 编写makefile文件
4.2.2 利用make工具自动生成可执行程序
4.2.3 总结
五、gdb 调试
5.1 Debug 版本和 Release 版本
5.2 单进程、单线程基础调试命令
5.3 使用GDB软件调试程序的基本步骤
5.4 如何在自动化编译工具中加入命令自动生成含有调试信息的Debug版本
5.5 多进程调试命令
5.6 多线程调试命令 一、第一个hello world程序
1.1 创建.c文件 1.2 编译链接 运行可执行程序 C语言是一门编译型语言编译型语言首先将源代码编译生成机器语言再由机器运行机器码二进制。对于编译型语言绕不过的就是编译器。GCC(GNU编译器套件)GNU Compiler Collection。可以编译C、C、JAVA、Fortran、Pascal、Object-C、Ada等语言。 gcc是GCC中的GNU C CompilerC 编译器g是GCC中的GNU C CompilerC编译器 注意对于Linux平台下生成的可执行程序没有后缀.exe 关于编译链接的过程我们下面作详细分析。 二、编译链接过程 2.1 预编译阶段 a) 删除所有的“#define”并且展开所有的宏定义; b) 处理所有的条件预编译指令“#if”、“#ifdef”、“#endif”等; c) 处理“#include”预编译指令将被包含的文件插入到该预编译指令的位置; d) 删除所有的注释; e) 添加行号和文件名标识以便于编译器产生调试用的符号信息及编译时产生编译错误和警告时显示行号 f) 保留所有的#pragma 编译器指令因为编译器需要使用它们。 2.2 编译阶段 词法分析、语法分析、语义分析代码优化汇总符号。 2.3 汇编阶段 将汇编指令翻译成二进制格式生成各个 section生成符号表。 2.4 链接阶段 a) 合并各个 section调整 section 的起始位移和段大小合并符号表进行符号解析 给符号分配虚拟地址 b) 符号重定位 三、gcc 分步编译链接
3.1 一步完成编译链接生成可执行程序 gcc -o main main.c 3.2 分两步完成编译链接生成可执行程序 step1、gcc -c main.c 生成main.o文件 step2、gcc -o main main.o 生成main(main.exe)可执行程序 3.3 多文件编译链接 创建3个源文件如下add.c max.c main.c 方式1一步直接完成编译链接生成可执行程序 方式2分两步 首先先把每个文件生成对应的.o文件, gcc -c xxx.c其次将所有的.o文件链接生成可执行程序文件main, gcc -o main main.o xx.o xx.o 四、 make工具和makefile文件
4.1 什么是make和makefile 当源码文件比较多的时候就不适合通过直接输入gcc命令来编译这时候就需要一个自动化的编译工具, 这就是make工具make是一条命令makefile是一个文件两个搭配使用完成项目自动化构建。 make一般说GNU Make是一个软件用于将源代码文件编译为可执行的二进制文件make工具主要用于完成自动化编译。make工具编译的时候需要Makefile文件提供编译文件。Makefilemake工具所使用的文件Makefile指明了编译规则。makefile带来的好处就是“自动化编译”一旦写好只需要一个make命令整个工程完全自动编译极大的提高了软件开发的效率。 4.2 利用make工具完成上一小节的自动化编译过程
4.2.1 编写makefile文件 工程是需要被清理的像clean这种没有被第一个目标文件直接或间接关联那么它后面所定义的命令将不会被自动执行 不过我们可以显示要make执行。即命令——“make clean”以此来清除所有的目标文件以便重编译。 4.2.2 利用make工具自动生成可执行程序 4.2.3 总结 利用make工具完成自动化编译的大致步骤如下 提供好所有的源文件.c和makefile文件执行命令make, 自动生成编译链接四个阶段的所有文件 清理中间的目标文件执行命令make clean 五、gdb 调试
5.1 Debug 版本和 Release 版本 1、Debug 版本 Debug 版本为可调试版本生成的可执行文件中包含调试需要的信息。我们作为开发人 员最常用的就是 debug 版本的可执行文件。 Debug 版本的生成 因为调试信息是在编译过程时加入到中间文件.o中的所以必须在编译时控制其生成包含调试信息的中间文件。如gcc -o hello hello.c -g 2、Release 版本 Release 版本为发行版本是提供给用户使用的版本。用 gcc 默认生成的就是 Release 版 本。 因此我们使用gdb进行调试 首先将源代码编译、链接生成 Debug 版本的可执行文件然后通过‘gdb Debug 版本 的可执行文件名’进入调试模式。 5.2 单进程、单线程基础调试命令
命令作用l显示代码默认一次只显示10行b行号给指定行添加断点b函数名给指点函数的第一有效行添加一个断点info break显示断点信息delete 断点编号删除指定断点rrun运行程序启动调试代码nnext单步执行c continue继续执行直接执行到下一个断点处sstep进入将要被调用的函数中执行 finish跳出函数p 变量 print打印变量的值p 变量打印变量的地址p arr数组名打印数组所有元素的值ptype 变量显示变量类型btbreaktrace显示函数调用栈q quit退出调试 l 行号 就能跳转到该行。l 文件名:行号 能跳转文件 跳转别的文件的第几行 l add.c :1;显示函数调用的栈关系 上边信息显示当前所在位置下面信息显示执行完当前程序会回到哪一行。 5.3 使用GDB软件调试程序的基本步骤 GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。或许各位比较喜欢那种图形界面方式的像VC、BCB等 IDE的调试但如果你是在UNIX平台下做软件你会发现GDB这个调试工具有比VC、BCB的图形化调试器更强大的功能。调试程序的基本步骤如下 生成包含调试信息的Debug版本如gcc -o test test.c -g执行命令gdb test进入调试利用常用的命令 5.4 如何在自动化编译工具中加入命令自动生成含有调试信息的Debug版本 在前面定义一个 GDB-g在生成规则后加$(GDB)就会取GDB的值不让生成debug版本就是把GDB置空GDB。 5.5 多进程调试命令 gdbset follow-fork-mode mode mode 可以选择 parent 或者 child即选择调试那个进程。 注意未被跟踪调试的进程会直接执行结束。 5.6 多线程调试命令 a) 利用 info threads 查看线程信息 b) thread id 调试目标 id 指定的线程 c) set scheduler-locking off | on | step “off”表示不锁定任何线程 “on”只有当前被调试的线程继续运行 “step”在单步执行的时候只有当前线程会执行 以上就是全部内容请务必掌握这是后续学习的基础欢迎大家点赞加关注评论您的支持是我前进最大的动力下期再见