Makefile 文件的编写

Makefile文件的编写(实例详解) 在实例中我通过工程中3个C文件,学习了Makefile中变量的使用,变量的赋值,特殊符号,通配符等等。并进行多文件的编写和改进,从而学习了Makefile的基础知识和理解如何编译和链接这几个文件。... 阅读详情

原文出处:http://www.cnblogs.com/OpenShiFt/p/4313351.html

学习前的准备

需要准备的工程目录结构如下:

.
├── add
│   ├── add_float.c
│   ├── add.h
│   └── add_int.c
├── main.c
└── sub
    ├── sub_float.c
    ├── sub.h
    └── sub_int.c

文件编译为可执行文件cacu
NOTE:需要的源代码:MakefileExample.tar

Makefile的介绍

使用 GCC 的命令行进行程序编译在单个文件下是比较方便的,当工程中的文件逐渐增多,甚至变得十分庞大的时候,使用 GCC 命令编译就会变得力不从心。Linux 中的 make 工具提供了一种管理工程的功能,可以方便的进行程序的编译,对更新的文件进行重编译。

Makefile的基本格式为:

TARGET... : DEPENDEDS...
    COMMAND
    ...
    ...
  • TARGET:规则所定义的目标,通常是最后生成的文件,也可以是一个“动作”,称之为“伪目标”。
  • DEPENDEDS:执行此规则所必须的依赖条件。
  • COMMAND:规则所执行的命令。命令可以是多个,每个命令占一行,以 Tab 开头。

动手编写多文件工程的Makefile

1.命令行编译程序

如果在命令行下手动编译该程序比较麻烦,需要先编译每个文件,生成目标文件,最后再将5个目标文件编译成可执行文件。

#get add_int.o target
gcc -c add/add_int.c -o add/add_int.o -ggdb

#get add_float.o target
gcc -c add/add_float.c -o add/add_float.o -ggdb

#get sub_float.o target
gcc -c sub/sub_float.c -o sub/sub_float.o -ggdb

#get sub_int.o target
gcc -c sub/sub_int.c -o sub/sub_int.o -ggdb

#get main.o target
gcc -c main.c -o main.o -Iadd -Isub -ggdb

#get cacu bin file
gcc -o cacu add/add_int.o add/add_float.o sub/sub_int.o sub/sub_float.o main.o -ggdb

#get main.S target
gcc -S add/add_int.o add/add_float.o sub/sub_int.o sub/sub_float.o main.o

2.多文件的Makefile

使用make进行项目管理,需要编写Makefile。在编译时,make程序按照顺序从Makefile文件中读取指令,依次执行!

#get cacu bin file
cacu:add_int.o add_float.o sub_int.o sub_float.o main.o
    gcc -o cacu add/add_int.o add/add_float.o \
        sub/sub_int.o sub/sub_float.o main.o -ggdb

#get add_int.o target
add_int.o:add/add_int.c add/add.h
    gcc -c -o add/add_int.o add/add_int.c -ggdb

#get add_float.o target
add_float.o:add/add_float.c add/add.h
    gcc -c -o add/add_float.o add/add_float.c -ggdb

#get sub_int.o target
sub_int.o:sub/sub_int.c sub/sub.h
    gcc -c -o sub/sub_int.o sub/sub_int.c -ggdb

#get sub_float.o target
sub_float.o:sub/sub_float.c sub/sub.h
    gcc -c -o sub/sub_float.o sub/sub_float.c -ggdb

#get main.o target
main.o:main.c add/add.h sub/sub.h
    gcc -c -o main.o main.c -Iadd -Isub -ggdb

#clean project
clean:
    rm -f cacu add/add_int.o add/add_float.o \
        sub/sub_int.o sub/sub_float.o main.o

当需要编译工程时,直接在工程目录中执行make即可。如果想清除编译过程中生成的目标文件和cacu,执行make clean即可。

3.使用用户自定义变量的Makefile

在Makefile文件中,用户可以自定义变量,方便用户修改参数。
使用变量后,原本冗长的文件可以化简为:

CC = gcc
CFLAGS = -Iadd -Isub -O2
OBJS = add/add_int.o add/add_float.o sub/sub_float.o sub/sub_int.o main.o
TARGET = cacu
RM = rm -f

$(TARGET):$(OBJS)
    $(CC) -o $(TARGET) $(OBJS) $(CFLAGS)

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

clean:
    $(RM) $(TARGET) $(OBJS)

NOTE:$(OBJS):%.o:%.c中 %.o:%.c 是将 $(OBJS) 中以 .o 结尾的文件替换成以 .c 结尾的文件。

其中  <和 @ 是自动化变量,下一节会介绍。

4.使用预定义变量的Makefile

在Makefile中还有一些变量是系统预定义的,用户可以直接使用。

Makefile中经常使用的变量及含义

变量名 含 义 默 认 值
AR 生成静态库库文件的程序名称 ar
AS 汇编编译器的名称 as
CC C语言编译器的名称 cc
CPP C语言预编译器的名称 \$(CC) -E
CXX C++语言编译器的名称 g++
FC FORTRAN语言编译器的名称 f77
RM 删除文件程序的名称 rm -f
ARFLAGS 生成静态库库文件程序的选项 无默认值
ASFLAGS 汇编语言编译器的编译选项 无默认值
CFLAGS C语言编译器的编译选项 无默认值
CPPFLAGS C语言预编译器的编译选项 无默认值
CXXFLAGS C++语言编译器的编译选项 无默认值
FFLAGS FORTRAN语言编译器的编译选项 无默认值

因此,前面的Makefile文件可以改写成:

CFLAGS = -Iadd -Isub -O2
OBJS = add/add_int.o add/add_float.o \
       sub/sub_int.o sub/sub_float.o main.o
TARGET = cacu

$(TARGET):$(OBJS)
    $(CC) -o $(TARGET) $(OBJS) $(CFLAGS)

clean:
    -$(RM) $(TARGET) $(OBJS)

其中变量$(CC) $(RM)可以直接使用,默认值分别是cc和rm -f。另外CFLAGS等变量是调用编译器时的默认选项配置,在生成main.o时没有指定编译选项,make程序自动调用了文件中定义的CFLAGS选项来增加头文件的搜索路径。

5.使用自动变量的Makefile

还记得上面出现的 \$< 和 \$@ 吗?它们是Makefile中的自动变量,分别代表依赖项和目标项。下面是一些常见的自动变量及其含义:

Makefile 中常见的自动变量和含义

变量 含义
* 表示目标文件的名称,不包含目标文件的扩展名
+ 表示所有的依赖文件,这些依赖文件之间以空格分开,按照出现的先后为顺序,其中可能包含重复的依赖文件
< 表示依赖项中第一个依赖文件的名称
? 依赖项中,所有目标文件时间戳晚的依赖文件,依赖文件之间以空格分开
@ 目标项中目标文件的名称
^ 依赖项中,所有不重复的依赖文件,这些文件之间以空格分开

由此,对上面的Makefile文件进行重写,代码如下:

CFLAGS = -Iadd -Isub -O2
OBJS = add/add_int.o add/add_float.o \
       sub/sub_int.o sub/sub_float.o main.o
TARGET = cacu

$(TARGET):$(OBJS)
    $(CC) $^ -o $@ $(CFLAGS)

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

clean:
    -$(RM) $(TARGET) $(OBJS)

6.设置搜索路径

在大的系统中,通常存在很多目录,手动添加目录的方法不仅十分笨拙而且容易造成错误。Make 的目录搜索功能提供了一个解决此问题的方法,指定需要搜索的目录, make 会自动找到指定文件的目录并添加到文件上, VPATH 变量可以实现此目的。VPATH 变量的使用方法如下:

VPATH = path1:path2:...

VPATH 右边是冒号(:)分割路径名称,例如下面的指令:

VPATH = add:sub
add_int.o:%.o:%.c
    $(CC) -c -o $@ $<

Make 的搜索路径包含 add 和 sub 目录。add_int.o 规则自动扩展成如下代码:

add_int.o:add/add_int.c
    cc -c -o add_int.o add/add_int.c

用添加路径的方法改写上面的 Makefile 文件,代码如下:

CFLAGS = -Iadd -Isub -O2
OBJDIR = objs
VPATH = add:sub:.
OBJS = add_int.o add_float.o sub_int.o sub_float.o main.o
TARGET = cacu

$(TARGET):$(OBJSDIR) $(OBJS)
    $(CC) -o $(TARGET) $(OBJDIR)/*.o $(CFLAGS)

$(OBJDIR):
    mkdir -p ./$@

$(OBJS):%.o:%.c 
    $(CC) -c $(CFLAGS) $< -o $(OBJDIR)/$@

clean:
    -$(RM) $(TARGET)
    -$(RM) $(OBJDIR)/*.o -r

7.自动推导规则

使用命令 make 编译扩展名为 .c 的 C 语言文件的时候,源文件的编译规则不用明确地给出。这是因为 make 进行编译的时候会使用一个默认的编译规则,按照默认规则完成对 .c 文件的编译,生成对应的 .o 文件。它执行命令 cc -c 来编译 .c 源文件。在 Makefile 中只需要给出需要重建的目标文件(一个 .o 文件),make 会自动为这个 .o 文件寻找合适的依赖文件(对应的 .c 文件),并且使用默认的命令来构建这个目标文件。

对于上边的例子,默认规则是使用命令cc -c main.c -o main.o来创建文件 main.o 。对一个目标文件是“文件名.o“,依赖文件是”文件名.c“的规则,可以省略其编译规则的命令行,由 make 命令决定如何使用编译命令和选项。此默认规则称为 make 的隐含规则。

这样,在书写 Makefile 时,就可以省略掉描述 .c 文件和 .o 依赖关系的规则,而只需要给出那些特定的规则描述(.o 目标所需要的 .h 文件)。因此上面的例子可以使用更加简单的方式书写, Makefile 文件的内容如下:

CFLAGS = -Iadd -Isub -O2
VPATH = add:sub
OBJS = add_int.o add_float.o sub_int.o sub_float.o main.o
TARGET = cacu
$(TARGET):$(OBJS)
    $(CC) -o $(TARGET) $(OBJS) $(CFLAGS)

clean:
    -$(RM) $(TARGET)
    -$(RM) $(OBJS)

8.递归 make

对于规模比较大的程序,需要多个人在多个目录下进行开发。如果只用一个 Makefile 来维护就会比较麻烦,因此可以在每个目录下建立自己的 Makefile ,然后在总控 Makefile 中调用子目录的 Makefile 文件。

目录结构如下:

.
├── add
│   ├── add_float.c
│   ├── add.h
│   ├── add_int.c
│   └── Makefile
├── main.c
├── Makefile
└── sub
    ├── Makefile
    ├── sub_float.c
    ├── sub.h
    └── sub_int.c

1.递归调用的方式

add:
    cd add && $(MAKE)

它等价于

add:
    $(MAKE) -C add

2.总控Makefile

CC = gcc
CFLAGS = -O2
TARGET = cacu
export OBJSDIR = $(shell pwd)/objs

$(TARGET):$(OBJSDIR) main.o
    $(MAKE) -C add
    $(MAKE) -C sub
    $(CC) -o $(TARGET) $(OBJSDIR)/*.o

$(OBJSDIR):
    mkdir -p $@

main.o:%.o:%.c
    $(CC) -c $< -o $(OBJSDIR)/$@ $(CFLAGS) -Iadd -Isub

clean:
    -$(RM) $(TARGET)
    -$(RM) $(OBJSDIR)/*.o

如果总控 Makefile 中的一些变量需要传递给下层的 Makefile,可以使用 export 命令。如:export OBJSDIR = ./objs

3.子目录Makefile的编写

Add 目录下的 Makefile 如下:

OBJS = add_int.o add_float.o
all:$(OBJS)

$(OBJS):%.o:%.c
    $(CC) -c $< -o $(OBJSDIR)/$@ $(CFLAGS)

clean:
    $(RM) $(OBJS)

Sub 目录下的 Makefile 如下:

OBJS = sub_int.o sub_float.o
all:$(OBJS)

$(OBJS):%.o:%.c
    $(CC) -c $< -o $(OBJSDIR)/$@ $(CFLAGS)

clean:
    $(RM) $(OBJS)

Makefile 中的函数

1.获取匹配模式的文件名wildcard

这个函数的功能是查找当前目录下所有符合模式 PATTERN 的文件名,其返回值是以空格分割的、当前目录下的所有符合模式 PATTERN 的文件名列表。其原型如下:

$(wildcard PATTERN)

例如,如下模式返回当前目录下所有扩展名位 .c 的文件列表。

$(wildcard *.c)

2.模式替换函数patsubst

这个函数的功能是查找字符串 text 中按照空格分开的单词,将符合模式 pattern 的字符串替换成 replacement。 Pattern 中的模式可以使用通配符, % 代表 0 个到 n 个字符,当 pattern 和 replacement 中都有 % 时,符合条件的字符将被 replacement 中的替换。函数的返回值是替换后的新字符串。其原型如下:

$(patsubst pattern, replacement, text)

例如,需要将 C 文件替换为 .o 的目标文件可以使用如下模式:

$(patsubst %.c, %.o, add.c)

上面的模式将 add.c 字符串作为输入,当扩展名为 .c 时符合模式 %.c ,其中 % 在这里代表 add,替换为 add.o,并作为输出字符串。

$(patsubst %.c, %.o, $(wildcard *.c))

输出的字符串将当前扩展名为 .c 的文件替换成 .o 的文件列表。

3.循环函数foreach

这个函数的原型为:

$(foreach VAR, LIST, TEXT)

函数的功能为 foreach 将 LIST 字符串中一个空格分割的单词,先传给临时变量 VAR ,然后执行 TEXT 表达式, TEXT 表达式处理结束后输出。其返回值是空格分割表达式 TEXT 的计算结果。

例如,对于存在 add 和 sub 的两个目录,设置 DIRS 为 "add sub ./" 包含目录 add、sub 和当前目录。表达式 $(wildcard $(dir)/*.c) ,可以取出目录 add 和 sub 及当前目录中的所有扩展名为 .c 的C语言源文件:

DIRS = sub add ./
FILES = $(foreach dir, $(DIRS), $(wildcard $(dir)/*.c))

利用上面几个函数对原有的 Makefile 文件进行重新编写,使新的 Makefile 可以自动更新各个目录下的C语言源文件:

CC = gcc
CFLAGS = -O2 -Iadd -Isub
TARGET = cacu
DIRS = sub add .
FILES = $(foreach dir, $(DIRS), $(wildcard $(dir)/*.c))
OBJS = $(patsubst %.c, %.o, $(FILES))
$(TARGET):$(OBJS)
    $(CC) -o $(TARGET) $(OBJS)

clean:
    -$(RM) $(TARGET)
    -$(RM) $(OBJS)

总结

至此,已经可以阅读大部分软件的 Makefile 了~~~

转载请注明地址:http://www.cnblogs.com/OpenShiFt/ 谢谢!
Makefile文件的编写 文章目录前言一、最简单的 Makefile 文件举例二、使用步骤1.引入库2.读入数据总结欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 前言 Makefile文件的编写规则及内容 一、最. 阅读详情

相关推荐

编写 Makefile文件 (一)

参考:《linux程序设计(第四版)》 本文的编写从简单到复杂,一步一步完成Makefile文件的编写和完善。首先看一下我们的程序有哪些文件: 文件内的程序也很简单,就是输出该文件已经被调用,代码如下: void funcPrintf(void) { printf("------ func.c ------\n"); } 如果我们想要编译一个文件,首先想到的是在shell 下执行gcc命令,那么我们先通过几个shell脚本来实现文件的编译。 #! /bin/bash set .

李庆年 5031

makefile编写

makefile注意点

chen8766250的博客 486

从0开始教你编写Makefile文件

编写Makefile第一步,了解什么是Makefile?每当我们写大型项目时,一般需要很多源文件,源文件会在不同的目录中的文件夹里面包含着,这样我们所有的源文件不会在一个文件中包含,用gcc-omain所有的.c文件来编译,就很麻烦了,你需要记住所有的.c文件,那么为了方便编译链接,就此诞生。在学习Makefile之前,首先介绍一下make命令,make命令是GNU的工程化编译工具,它用于编译大量互相关联的源代码,使用它可以实现项目的工程化管理,提高开发效率。.obj.o.lib.a)。..........

oorik的博客 1万+

一个工程实例来学习 Makefile

March 3, 2015 8:19 PM Makefile 文件的编写 学习前的准备 需要准备的工程目录结构如下: . ├── add │ ├── add_float.c │ ├── add.h │ └── add_int.c ├── main.c └── sub ├── sub_float.c ├── sub.h └── sub_int.c 文件编...

balian5181的博客 513

makefile编写不同目录下的文件的方法

整体目录结构: //hello.c #include"myhead.h" int main(void) { printf("hello world\n"); return 0; } include文件夹下放着 myhead.h文件,myhead.h文件的内容如下 #include<stdio.h> makefile文件的内容如下: hello:hello.o gcc...

qq_38158479的博客 1890

XGBoost实战:从原理到调参,手把手教你提升模型性能(附Python代码)

本文深入解析XGBoost核心原理,并提供一套从数据准备、系统性调参到生产部署的完整实战指南。通过剖析目标函数、正则化项与分裂算法,帮助读者理解参数背后的数学逻辑,并利用交叉验证、早停法及自动化工具(如Optuna)高效提升模型性能。文中附有详尽的Python代码示例,涵盖类别特征处理、缺失值应对、不平衡数据调整及模型可视化等高级技巧。

weixin_29178069的博客 460

Makefile基础

Makefile基础 编写规则和格式 main: main.o stack.o maze.o gcc main.o stack.o maze.o main.o: main.h stack.h maze.h stack.o: stack.h main.h maze.o: maze.h main.h clean: -rm main *.o .PHONY: clean celan讲解 通常Makefile都会有一个 clean 规则,用于清除编译过程中产生的二进制文件

renxt0310的博客 439

UDP协议详解——使用Socket通信

UDP(UserDatagramProtocol)是一个简单的面向消息的传输层协议,尽管UDP提供标头和有效负载的完整性验证(通过校验和),但它不保证向上层协议提供消息传递,并且UDP层在发送后不会保留UDP 消息的状态。因此,UDP有时被称为不可靠的数据报协议。如果需要传输可靠性,则必须在用户应用程序中实现。UDP使用具有最小协议机制的简单无连接通信模型。UDP提供数据完整性的校验和,以及用于在数据报的源和目标寻址不同函数的端口号。它没有握手对话,因此将用户的程序暴露在底层网络的任何不可靠的方面。

qq_3517289697的博客 3387

Makefile编译——基础

Make工程管理器也就是个“自动编译管理器”,自动发现更新过的文件而减少编译的工作量,同时,它通过读入Makefile文件的内容来执行大量的编译工作;Make将只编译改动的代码文件,而不用完全编译。

qq_50597556的博客 3135

Opencv4.5.1 微信二维码识别功能 QRCode 编译与使用 C++

部分参考:https://mp.weixin.qq.com/s/2GZAJAUPHTXFOKDRv-D21Q 一、下载源码 https://github.com/opencv 二、源码编译 ① 在cmake中添加源码编译路径和生成路径,第一次点击configure。 ② 添加contrib路径 第一次configure后,找到OPENCV_EXTRA_MODULES_PATH,将contrib路径添加进来,注意要具体到modules/,继续configure。 ..

zaibeijixing的专栏 1万+

GD32F303串口DMA发送数据避坑指南:为什么你的发送函数会卡住?

本文深入解析GD32F303单片机串口DMA发送数据时常见的卡死问题,提供详细的避坑指南。从DMA传输完成中断时序、发送状态管理到双通道DMA的特别注意事项,全面剖析问题根源并给出解决方案,帮助开发者构建健壮的DMA发送机制。

weixin_27038245的博客 295

如何编写makefile文件

makefile文件编写入门

weixin_50941083的博客 3815

Spring Security 珍藏版快速入门

文章目录一、前期配置二、Spring Security 测试三、案例:自定义页面(XML配置用户信息)三、案例:自定义页面(数据库存储用户信息) 一、前期配置 (1)pom.xml <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-web</artifactId> <version>${s

南淮北安的博客 633

Makefile文件编写简单版教程

本文旨在从零开始学习Makefile的编写,先了解make命令,后面再详细介绍Makefile文件的编写规则,日常不需要太复杂的makefile文件编写,所以本文的例子比较简陋~。 引入Makefile文件是因为工程项目中有很多文件,并且它们相互依赖,一个一个编译会很花时间,而且如果有某个文件修改过需要重新编译,那么所有相关的文件都要重新编译,这就很操蛋。Makefile文件是去判断哪个文件被修...

wh_computers的博客 5022

【30天从零玩转AI应用开发】第16篇:智能体Agent入门——ReAct框架原理+首个会思考、会动手的AI实战

摘要: 本文介绍了AI智能体(Agent)的核心概念及其与普通大模型(LLM)的区别。通过ReAct(Reason+Act)框架,智能体实现了自主思考、调用工具和分步执行的能力。文章详细讲解了LangChain Agent的四大组件,并推荐新手使用ZERO_SHOT_REACT_DESCRIPTION类型。最后提供了一个完整的智能体实战代码示例,该智能体具备数学计算和天气查询功能,能够自主选择工具完成任务,展示了AI从”被动回答“到”主动行动“的关键进化。

在上海谋生的软件喵记录喵生 626

【多模态实验总结】整理了几十篇文章,理清 多模态目标检测 在写论文中需要做哪些实验

此篇文章中将多模态目标检测所做的实验,分成了各个类别,目的是为了对多模态的实验有一个清晰的理解。可以看到,很多表格中放的并不是做了单一的某一个对比,而是将提出的模型,在不同的骨干、数据集上的效果与基线进行对比,使内容更全面。因此这里提到的各种实验,大家在后续改进写论文过程中可以根据自己的论文内容进行整合。对于这里提到的这些文章,大家都可以看看,我只是按照我这里的分类截取了部分实验,这里提到的所有实验在每篇文章中也基本能看到相应的实验。

Limiiiing的博客 3142

makefile文件的编写

makefile文件 makefile的使用场景 makefile用于编译大量的.c文件 或者是分文件编写的(包含多个 .h 多个.c文件 和主文件 ) 将其转换为可执行文件 。 makefile的作用正是简化了上面的步骤,makefile的使用前提是掌握gcc 然后循序掌握其他内容 1 - 从简单的gcc 操作 到 转换为makefile 如我们要将 main.c 变为可执行文件 main 需要经历 gcc -E gcc -S gcc -C 当然对于单个.c文件转变为可执行文件 我们

C++ 是一门不原谅粗心的语言,而我恰好喜欢这种不原谅。 我是 x,正在成为更严谨的 C++ 开发工程师的路上。 1万+

外骨骼机器人(二):自适应振荡器

振荡器是一种数学工具,可以用于实时跟踪、预测类周期信号的频率、相位、幅值等,而助行外骨骼机器人需要自动适应人体的行走频率、幅度,两者相结合,就能使助行外骨骼机器人拥有更舒适、更自然的行走步态。 ......

行者无疆的博客 4264

makefile文件编写

Makefile 中的变量用于存储常用的路径、编译选项、源文件列表等,方便后续引用和修改。

qq_56842330的博客 1028

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

简单的makefile文件编写

习惯了windows下ide创建工程已经代码的编写,然后一键运行,很简单,因为很多事ide都帮我们做了,但是linux下不一样,需要手动编译,执行一条条的命令,一般工程都是由于很多文件组成的,比如c++有很多.h和.cpp文件,难道编译的话需要我们一个一个手动编译?比如这样: g++ main.cpp fun1.cpp fun2.cpp -o main 如果有几百个几千个呢?在终端敲命令岂不是累...

那又怎样的博客 1万+

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

编写Makefile文件

编写Makefile文件

hfgyfd的博客 713
上一篇: 内存泄露的检测工具——Valgrind
下一篇: 动态库的加载
LinuxG_G
博客等级 码龄15年 58粉丝 176原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值