参考主要来自于chatgptChatGPT (oaifree.com)
- 首先源文件到可执行文件有几个过程
预编译
gcc -E hello.c -o hello.i # 预处理
编译
gcc -S hello.i -o hello.s # 编译
汇编
gcc -c hello.s -o hello.o # 汇编
链接
gcc hello.o -o hello # 链接
- 每一个过程都会生成一个指定后缀的文件,但是我现在使用的时候,都是一步直接得到汇编之后的可执行文件,如果是多个文件,需要将多个文件进行连接之后得到一个可执行文件,然后调用这个可执行文件.
- 实际使用过程中的展示:(有两个文件:string_function.c 和main.c)需要先将两个文件都先分别汇编之后,连接成一个可执行文件。
- 使用gdb进行debug
- 一些常见的指令(可执行文件生成时需要使用 -g 的指令,这样才能保留调试信息)
启动 | gdb main | |
设置断点 | break :line break filename:line | |
运行 | run | |
继续运行 | continue | |
进入函数 | step | |
打印变量 | Print x | |
查看代码 | List :line | |
退出调试 | Quit or ctrl+d |
这种调试不是很方便,win下面还是推荐使用vscode 封装好的调试工具
- 使用Makefile对脚本语言对源文件进行编译
首先要安装mingw32同时把make安装上,可以通过mingw32-make --version 查询是不是安装成功了,我这个安装的需要通过mingw32-make 对make进行使用
Makefile 有很多变量引用的方式,这里简单描述一下,之后遇到了再做添加
变量名设置 | = | |
变量替换 | A:字符段=new | |
变量的引用 | $(NAME) | |
变量的传递,在根目录下创建公用的变量,传递到子目录中使用,可以不用重复定义两种方式 |
| |
使用export将变量传递到环境中,子目录可以直接调用 | ||
- Makefile 语法格式
目标:依赖
规则
示例:(有两个文件:string_function.c 和main.c)需要先将两个文件都先分别汇编之后,连接成一个可执行文件。
Makefile是顺序执行,从第一个开始,为了得到目标,取下文找依赖的实现,所有会得到mainobj和utilobj最终得到target
规则的话就是gcc编译源文件的过程,不过这里是通过makefile进行自动化运行了,不用一条一条在终端里面去实现了。
- 补充一条指令 .PHONY
- 实现多层Makefile
文件结构如下,存在一个根文件 里面 有 main sub bin Makefile,通过执行根文件下面的Makefile,可以对目录下面的程序进行编译,并将可执行文件存入bin目录下面
三级Makefile的程序如下
根目录 | 主要是两个for循环,在每个子目录下面执行对应的Makefile | |
main | 对main.c进行编译,已经将依赖文件进行链接,这里用gcc 有操作 -I 表示包含头文件目录,不添加的话对于其它路径的头文件将会找不到。 Move 是将文件移到目标的目录下面。 对sub文件的链接,需要提供准确的文件路径。 | |
sub | 由于这个相对于main来说是一个库函数或者功能函数,只需要将将转会汇编文件即可,方便main进行链接。 |
执行的效果
在根目录下面调用mingw32-make 可以看到如下效果,在win10 下面可执行文件的格式 main.exe
执行之后生成了三个文件
在bin中找到可执行文件,执行得到结果