首页 > 其他分享 >day04(C高级)编译工具

day04(C高级)编译工具

时间:2024-08-15 20:24:04浏览次数:7  
标签:文件 gcc make 高级 day04 编译 clean test main

编译工具

一.gcc 编译工具

预处理:#开头内容,展开头文件,替换宏定义,不会进行语法检查。

gcc -E xx.c -o xx.i

编译:检查语法错误,词法错误,将.i文件转换成.s汇编文件。

gcc -S xx.i -o xx.s

汇编:将汇编文件转换成二进制文件(不可执行)

gcc -c xx.s -o xx.o

链接:链接库文件,将不可执行的二进制文件转换成可执行的二进制文件。

gcc xx.o -o xx

gcc xx.c 默认生成a.out

-o: 生成一个新名字的可执行文件

二.gdb调试工具

1)gcc -g xx.c 生成 a.out

2)gdb a.out

r: 运行代码

l: 查看文件

b 行号或者函数名:添加断点

info b:查看断点情况

d num(断点编号):删除断点

p 变量名:查看变量的值

s/n: 单步运行,s会进入子函数顺序执行;单步跳过,n不会进入子函数

c: 执行到下一个断点的位置

help:帮助

q: 退出

步骤:

代码写好后,先通过gcc -g进行编译代码,没有错误后,可以通过gdb a.out进行调试,输入l查看文件内容,通过b设置断点,输入r进行运行,n或s进行单步调试,q退出

三.make工具

3.1 定义

make:工程管理器,顾名思义,是指管理较多的文件

make工程管理器也就是个“自动编译管理器”,这里的“自动”是指它能构根据文件时间戳自动发现更新过的文件而减少编译的工作量,同时,它通过读入Makefile文件文件的内容来执行大量的编译工作。

Makefile或makefile时make读取的唯一配置文件。

3.2 makefile格式

目标:依赖

        命令

注意:命令前面需要用TAB键

理解:通俗一点讲就是 依赖(相当于原材料) -> 命令(加工)-> 目标(产物)

makefile根据以下步骤编写:

gcc -c xx.c -o xx.o

gcc xx.o -o xx

例如:写一个test.c,再写一个makefile文件

test:test.o
	gcc test.o -o test
test.o:test.c
	gcc -c test.c -o test.o
使用make命令执行,会默认找第一个目标来生成

目标加:是伪目标

伪目标:它的目的并不是创建目标文件(所以称作“伪”),而是想去执行这个目标下面的命令。

例如:添加删除功能

test:test.o
	gcc test.o -o test
test.o:test.c
	gcc -c test.c -o test.o

.PHONY:clean
clean:
	rm test test.o

执行:make clean

规则中 rm 命令不是为了创建 clean 这个文件,而是执行删除某些文件的任务。当工作目录中不存在以 clean 命令的文件时,输入 make clean 命令,命令 rm test test.o 总会被执行 ,这也是我们期望的结果。

如果避免同名文件可以加:.PHONY:clean 不然如果当前目录下有名字叫clean的文件会报:make: “clean”已是最新。

3.3 用make管理多个文件

先分文件:

makefile:

test:main.o test.o
	gcc main.o test.o -o test
main.o:main.c
	gcc -c main.c -o main.o
test.o:test.c
	gcc -c test.c -o test.o

.PHONY:clean
clean:
	rm test *.o

执行:make

清除中间文件以及可执行文件:make clean

.PHONY:clean 为了避免路径中有同名文件clean

3.4 makefile变量
3.4.1 自定义变量

自己定义的变量:一般用大写表示变量名,取变量的值用$(变量名)

给变量赋值:

= 递归方式展开

:= 直接赋值(当前的值是什么就立即赋值)

+= 追加新的值

?= 判断之前是否定义,如果定义了,不重新赋值,否则赋值

3.4.2 预定义变量

系统预先定义好的一些变量,可能有默认值可能没有默认

RM 文件删除程序的名称,默认值为rm -f

CC C编译器的名称,默认值为cc。

CPP C预编译器的名称,默认值为$(CC) –E。

CFLAGS C编译器的选项,无默认值。

OBJS 生成的二进制文件或目标文件,自己定义

CC=gcc
CFLAGS=-c -g -Wall #-c编译 -g加调试 -Wall显示警告
OBJS=main.o test.o
#CC=arm-linux-none-gnueabi-gcc #交叉编译链

test:$(OBJS)
	$(CC) $(OBJS) -o test
main.o:main.c
	$(CC) $(CFLAGS) main.c -o main.o
test.o:test.c
	$(CC) $(CFLAGS) test.c -o test.o

.PHONY:clean
clean:
	$(RM) test *.o

3.4.3 自动变量

$< 第一个依赖文件的名称

$^ 所有不重复的依赖文件,以空格分开

$@ 目标文件的完整名称

CC=gcc
CFLAGS=-c -g -Wall 
OBJS=main.o test.o

test:$(OBJS)
	$(CC) $^ -o $@
main.o:main.c
	$(CC) $(CFLAGS) $< -o $@
test.o:test.c
	$(CC) $(CFLAGS) $< -o $@

.PHONY:clean
clean:
	$(RM) test *.o

可以用%.c和%.o代替每一个.c和.o文件: 相当于让每个.c生成各自的.o

CC=gcc
CFLAGS=-c -g -Wall 
OBJS=main.o test.o

test:$(OBJS)
	$(CC) $^ -o $@
%.o:%.c
	$(CC) $(CFLAGS) $< -o $@

.PHONY:clean
clean:
	$(RM) test *.o

3.5 make指令

make -s: 隐藏执行的指令

make -C 路径:进入指定路径去执行make指令

总结:

标签:文件,gcc,make,高级,day04,编译,clean,test,main
From: https://blog.csdn.net/QR70892/article/details/141230629

相关文章

  • ofcommon.dll故障深度探索:Office组件恢复的高级策略揭秘
    解决ofcommon.dll丢失的问题,采取以下专业步骤可以帮助您恢复Office组件的正常运作:1.系统文件检查:•以管理员身份运行命令提示符,输入sfc/scannow并回车。这将扫描并修复系统文件,包括可能缺失的ofcommon.dll。2.Office修复:•打开“控制面板”>“程序”>“程序和功......
  • 谷歌的高级指令有哪些
    今天会分享一些组合用法,这样就能节省许多时间可以放在跟进客户上面(本文只介绍谷歌的搜索指令,并无推广)partone谷歌常用的搜索引擎指令:1、Inurl,在网址中2、Intext,在网页内容中3、Site,在网站中01在网址中inurl在网址中 •使用inurl在网址中• 当我们用inurl......
  • Ubuntu中编译使用ANTs(医学图像配准)含github无法访问问题解决
    目录第一步、修改hosts文件1.打开https://github.com.ipaddress.com/ 2.打开https://fastly.net.ipaddress.com/github.global.ssl.fastly.net#ipinfo3.打开hosts文件,并在文件末尾添加如下内容 第二步、编译ANTs1)首先安装git、cmake以及c++编译器2)编译3)配置bin目录,......
  • 高级工程师面试大全- 数据库篇
    1.redis相关面试题 1.1 Redis为什么执行这么快?(1)纯内存操作:Redis将所有数据存储在内存中,这意味着对数据的读写操作直接在内存中运行,而内存的访问速度远远高于磁盘。这种设计使得Redis能够已接近硬件极限的速度处理数据读写(2)单线程模型:Redis使用单线程模型来处理客户端请求......
  • Qt5编译qmqtt库使用MQTT协议连接华为云IOT完成数据上传与交互
    一、前言随着物联网技术的发展,越来越多的设备通过网络互相连接,形成了庞大的智能系统。这些系统能够收集、分析并响应各种数据,从而实现自动化控制和智能化管理。在这个背景下,MQTT成为了一个广泛使用的轻量级消息传输协议,特别适用于资源受限的环境,如移动应用或远程传感器网......
  • C++ 编译过程
    源码——>预处理器.i文件——>编译器.s文件——>汇编器.o文件——>链接器——>执行程序 预处理器:读取代码里#开头的命令,并把他插入到程序文本里,生产已.i为后缀名的文件编译器:把.i 文件生成汇编文件 .s汇编器:把汇编文件生成二进制文件.a 链接器:链......
  • MATLAB R2023b配置Fortran编译器
    MATLABR2023b配置Fortran编译器引言1.安装VisualStudio20192.安装IntelAPI20243.配置xml文件文件4.设置环境变量5.MATLAB编译Fortran引言当我们需要用到MATLAB编译Fortran代码后进行调用计算时,整个配置流程较繁琐。下面以MATLABR2023b为例,介绍配置Fortran......
  • 【PostgreSQL教程】PostgreSQL 高级篇之约束
    博主介绍:✌全网粉丝20W+,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物联网、机器学习等设计与开发。感兴趣的可以先......
  • Ardupilot源码的查看和编译(2)
    前面介绍了如何安装VSCode以及飞控源码的导入,继续上一节教程:Ardupilot源码的查看和编译(1)01—安装GDBGDB是UNIX及UNIX-like下的调试工具。如果在UNIX平台下做软件,GDB调试工具相比于VC、z的优点是具有修复网络断点以及恢复链接等功能,比BCB的图形化调试器有更强大的功能......
  • 《开发板 —— 交叉编译移植openssl、curl、mosquitto》
    1.移植openssl1.下载openssl,我这边下载的是openssl-3.3.1,下载后在linux中解压。2.配置编译安装(以下相关目录对应位置是随便写的,需要根据实际替换)#./configno-asm--prefix=/home/3520/software/openssh-server/package--cross-compile-prefix=arm-hisiv400-linux......