使用gcc编译.c文件,并使用gbd进行调试(学习笔记)

参考主要来自于chatgptChatGPT (oaifree.com)

  1. 首先源文件到可执行文件有几个过程

预编译

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)需要先将两个文件都先分别汇编之后,连接成一个可执行文件。

  1. 使用gdb进行debug
  • 一些常见的指令(可执行文件生成时需要使用 -g 的指令,这样才能保留调试信息)

    启动

 gdb main

设置断点

break :line

break filename:line

运行

run

继续运行

continue

进入函数

step

打印变量

Print x

查看代码

List :line

退出调试

Quit or ctrl+d

这种调试不是很方便,win下面还是推荐使用vscode 封装好的调试工具

  1. 使用Makefile对脚本语言对源文件进行编译

首先要安装mingw32同时把make安装上,可以通过mingw32-make  --version 查询是不是安装成功了,我这个安装的需要通过mingw32-make 对make进行使用

Makefile 有很多变量引用的方式,这里简单描述一下,之后遇到了再做添加

 变量名设置

=

变量替换

A:字符段=new

变量的引用

$(NAME)

变量的传递,在根目录下创建公用的变量,传递到子目录中使用,可以不用重复定义两种方式

  • 定义了编译器 CC 和编译选项 CFLAGS,并通过 $(MAKE) 命令使用 -C 选项切换到子目录。
  • 通过 CC="$(CC)" CFLAGS="$(CFLAGS)" 将 CC 和 CFLAGS 变量传递给子目录中的 Makefile。

使用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中找到可执行文件,执行得到结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值