我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Redis中Makefile文件是什么

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Redis中Makefile文件是什么

这篇文章给大家分享的是有关Redis中Makefile文件是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

1、前言

这里使用的源码版本是redis-6.2.1的。

2、Makefile文件详解

源代码根目录的Makefile文件内容如下:

default: all

.DEFAULT:	cd class="lazy" data-src && $(MAKE) $@install:	cd class="lazy" data-src && $(MAKE) $@.PHONY: install

从代码中可以看出以下几点信息:

  • 该文件的第一个目标是default,该目标没有实际作用,依赖于all目标

  • 代码中并没有所谓的all目标,所以当我们直接使用make时,首先会调用default目标,然后调用all目标,由于all目标不存在,所以会调用.DEFAULT目标来替代,在Makefile的执行语句中,$@代表的就是目标的意思,$(MAKE)代表的就是make,所以展开之后的代码如下,读者可以自行编译一下,看看第一条输出语句是否与我们分析的相同

cd class="lazy" data-src && make all
  • install目标和前面的类似,最终也是进去class="lazy" data-src/目录,然后调用该目录下的Makefile文件,区别只在于此时调用的目标变成了install而已,展开后的代码如下:

cd class="lazy" data-src && make install
  • 当传入参数是其他是,调用的都会转到.DEFAULT去,然后去调用子目录下的Makefile的对应的目标,以clean为例,代码如下:

cd class="lazy" data-src && make clean

3、class="lazy" data-src/Makefile文件详解

该文件是真正起编译作用的文件,内容比较多,比较杂,而且为了兼容多种编译器里面有不少分支选择语法,我们这里只以Linux下的gcc编译器为例去讲解,其余的没区别,就是通过判断语句去改变某些编译参数而已

3.1、Makefile.dep目标

Makefile在执行对应的目标之前,会先把非目标的指令给执行了,比如变量赋值、Shell语句等等,所以我们会发现,Makefile文件并不会完全按照顺序去执行的
相关代码如下:

NODEPS:=clean distclean# FINAL_CFLAGS里的各个变量原型STD=-pedantic -DREDIS_STATIC=''WARN=-Wall -W -Wno-missing-field-initializers
OPTIMIZATION?=-O2
OPT=$(OPTIMIZATION)DEBUG=-g -ggdb#CFLAGS 根据条件选择的,不重要的参数,忽略#REDIS_CFLAGS 根据条件选择的,不重要的参数,忽略FINAL_CFLAGS=$(STD) $(WARN) $(OPT) $(DEBUG) $(CFLAGS) $(REDIS_CFLAGS)REDIS_CC=$(QUIET_CC)$(CC) $(FINAL_CFLAGS)all: $(REDIS_SERVER_NAME) $(REDIS_SENTINEL_NAME) $(REDIS_CLI_NAME) $(REDIS_BENCHMARK_NAME) $(REDIS_CHECK_RDB_NAME) $(REDIS_CHECK_AOF_NAME)
	@echo ""
	@echo "Hint: It's a good idea to run 'make test' ;)"
	@echo ""Makefile.dep:
	-$(REDIS_CC) -MM *.c > Makefile.dep 2> /dev/null || trueifeq (0, $(words $(findstring $(MAKECMDGOALS), $(NODEPS))))-include Makefile.dep
endif

首先先补充以下几点Makefile的基础

  • Makefilefindstring函数的使用格式为$(findstring FIND, IN),表示在IN中查找FIND,如果查找到了就返回FIND,找不到就返回空

  • Makefilewords函数表示统计单词数目,例如$(words, foo bar)的返回值为"2"

  • MakefileMAKECMDGOALS变量表示传入的参数(全部)

  • MakefileCC默认值是cc

  • Makefile-MM是输出一个用于make的规则,该规则描述了源文件的依赖关系,但是不包含系统头文件

则可以总结出以下几点信息:

  • 里面的all目标正是我们前一节说到的那个默认的编译目标,但是我们可以自己试着去编译一下,会发现先生成的是Makefile.dep文件,因为他先执行了最下面那个判断语句,里面调用了Makefile.dep目标

  • 由于此时MAKECMDGOALS的值为all,不在NODEPS范围里,所以上面那个ifeq语句成立,会调用Makefile.dep目标

  • REDIS_CC的值由三个变量组成,QUIET_CC是打印调试信息的,读者可以自己去源码看相关内容,这部分不重要,我们忽略,CC的值代表的是编译器,FINAL_CFLAGS里面的值则是编译的一些参数,这些值在上面的代码中都已经摘录出来了

  • 综上所述Makefile.dep目标的作用就是生成当前目录下所有以.c结尾的文件的依赖关系,并写入Makefile.dep文件中,编译之后生成的文件内容如下所示,看起来挺乱,但是里面的内容其实将每个源文件最终生成的目标文件给列出来,并且将它需要的依赖列出来而已

acl.o: acl.c server.h fmacros.h config.h solarisfixes.h rio.h sds.h \
 connection.h atomicvar.h ../deps/lua/class="lazy" data-src/lua.h ../deps/lua/class="lazy" data-src/luaconf.h \
 ae.h monotonic.h dict.h mt19937-64.h adlist.h zmalloc.h anet.h ziplist.h \
 intset.h version.h util.h latency.h sparkline.h quicklist.h rax.h \
 redismodule.h zipmap.h sha1.h endianconv.h crc64.h stream.h listpack.h \
 rdb.h sha256.h
adlist.o: adlist.c adlist.h zmalloc.h
ae.o: ae.c ae.h monotonic.h fmacros.h anet.h zmalloc.h config.h \
 ae_epoll.c
ae_epoll.o: ae_epoll.c...

zipmap.o: zipmap.c zmalloc.h endianconv.h config.h
zmalloc.o: zmalloc.c config.h zmalloc.h atomicvar.h

3.2、通用的生成目标文件的target

代码如下:

.make-prerequisites:
	@touch $@ifneq ($(strip $(PREV_FINAL_CFLAGS)), $(strip $(FINAL_CFLAGS))).make-prerequisites: persist-settings
endif

ifneq ($(strip $(PREV_FINAL_LDFLAGS)), $(strip $(FINAL_LDFLAGS))).make-prerequisites: persist-settings
endif

%.o: %.c .make-prerequisites	$(REDIS_CC) -MMD -o $@ -c $<

以下是对这部分代码的解析:

  • 这部分是通用的根据源文件生成目标文件的targetMakefile%表示通配符,所以只要符合格式要求的都可以借助这段代码来生成对应的目标文件

  • .make-prerequisites没啥用忽略,而REDIS_CC的值在上一小节有说明了,是用于编译文件的指令

  • gcc-MMD参数与前面说的那个-MM是基本一致的,只不过这个会将输出内容导入到对应的%.d文件中

  • Makefile$@表示目标,$<表示第一个依赖,$^表示全部依赖

  • 综上,这个target的作用是依赖于一个源文件,然后根据这个源文件生成对应的目标文件,并且将依赖关系导入到对应的%.d文件中

下面是一个简单的例子:

# 假设生成的目标文件为acl.o,则代入可得acl.o: acl.c .make-prerequisites	$(REDIS_CC) -MMD -o acl.o -c acl.c
# 执行完成后在该目录下会生成一个acl.o文件和acl.d文件

3.3、all目标所依赖的各个子目标的名称设置

PROG_SUFFIX的值默认为空,可以忽略。这里设置的六个目标名都是会被all这个目标引用的,从名字可以看出这六个目标是对应着Redis不同的功能,依次是服务、哨兵、客户端、基础检测、rdf持久化以及aof持久化。
代码如下:

REDIS_SERVER_NAME=redis-server$(PROG_SUFFIX)
REDIS_SENTINEL_NAME=redis-sentinel$(PROG_SUFFIX)
REDIS_CLI_NAME=redis-cli$(PROG_SUFFIX)
REDIS_BENCHMARK_NAME=redis-benchmark$(PROG_SUFFIX)
REDIS_CHECK_RDB_NAME=redis-check-rdb$(PROG_SUFFIX)
REDIS_CHECK_AOF_NAME=redis-check-aof$(PROG_SUFFIX)

3.4、all目标所依赖的各个子目标的内容

  • REDIS_LD也是一个编译指令,和前面那个REDIS_CC有点像,只不过这个指定了另外的一些编译参数,比如设置了某些依赖的动态库、静态库的路径,读者有兴趣的话可以去看一下代码,看看REDIS_LD的详细内容

  • FINAL_LIBS是一系列动态库链接参数,读者有兴趣可以自行去Makefile里面查看该变量的内容,限于篇幅原因这里就不展开讲了

  • QUIET_INSTALL忽略(这个是自定义打印编译信息的),可以看出REDIS_INSTALL的值其实就是installLinux下的install命令是用于安装或升级软件或备份数据的,这个命令与cp类似,但是install允许你控制目标文件的属性,这里不作深入分析了,有兴趣的读者可以自行查阅相关的介绍install命令的文章。基本用法为:install class="lazy" data-src des,表示将class="lazy" data-src文件复制到des文件去
    代码如下:

REDIS_SERVER_OBJ=adlist.o quicklist.o ae.o anet.o dict.o server.o sds.o zmalloc.o lzf_c.o lzf_d.o pqsort.o zipmap.o sha1.o ziplist.o release.o networking.o util.o object.o db.o replication.o rdb.o t_string.o t_list.o t_set.o t_zset.o t_hash.o config.o aof.o pubsub.o multi.o debug.o sort.o intset.o syncio.o cluster.o crc16.o endianconv.o slowlog.o scripting.o bio.o rio.o rand.o memtest.o crcspeed.o crc64.o bitops.o sentinel.o notify.o setproctitle.o blocked.o hyperloglog.o latency.o sparkline.o redis-check-rdb.o redis-check-aof.o geo.o lazyfree.o module.o evict.o expire.o geohash.o geohash_helper.o childinfo.o defrag.o siphash.o rax.o t_stream.o listpack.o localtime.o lolwut.o lolwut5.o lolwut6.o acl.o gopher.o tracking.o connection.o tls.o sha256.o timeout.o setcpuaffinity.o monotonic.o mt19937-64.o
REDIS_CLI_OBJ=anet.o adlist.o dict.o redis-cli.o zmalloc.o release.o ae.o crcspeed.o crc64.o siphash.o crc16.o monotonic.o cli_common.o mt19937-64.o
REDIS_BENCHMARK_OBJ=ae.o anet.o redis-benchmark.o adlist.o dict.o zmalloc.o release.o crcspeed.o crc64.o siphash.o crc16.o monotonic.o cli_common.o mt19937-64.o

DEP = $(REDIS_SERVER_OBJ:%.o=%.d) $(REDIS_CLI_OBJ:%.o=%.d) $(REDIS_BENCHMARK_OBJ:%.o=%.d)-include $(DEP)INSTALL=install
REDIS_INSTALL=$(QUIET_INSTALL)$(INSTALL)# redis-server$(REDIS_SERVER_NAME): $(REDIS_SERVER_OBJ)
	$(REDIS_LD) -o $@ $^ ../deps/hiredis/libhiredis.a ../deps/lua/class="lazy" data-src/liblua.a $(FINAL_LIBS)# redis-sentinel$(REDIS_SENTINEL_NAME): $(REDIS_SERVER_NAME)
	$(REDIS_INSTALL) $(REDIS_SERVER_NAME) $(REDIS_SENTINEL_NAME)# redis-check-rdb$(REDIS_CHECK_RDB_NAME): $(REDIS_SERVER_NAME)
	$(REDIS_INSTALL) $(REDIS_SERVER_NAME) $(REDIS_CHECK_RDB_NAME)# redis-check-aof$(REDIS_CHECK_AOF_NAME): $(REDIS_SERVER_NAME)
	$(REDIS_INSTALL) $(REDIS_SERVER_NAME) $(REDIS_CHECK_AOF_NAME)# redis-cli$(REDIS_CLI_NAME): $(REDIS_CLI_OBJ)
	$(REDIS_LD) -o $@ $^ ../deps/hiredis/libhiredis.a ../deps/linenoise/linenoise.o $(FINAL_LIBS)# redis-benchmark$(REDIS_BENCHMARK_NAME): $(REDIS_BENCHMARK_OBJ)
	$(REDIS_LD) -o $@ $^ ../deps/hiredis/libhiredis.a ../deps/hdr_histogram/hdr_histogram.o $(FINAL_LIBS)

3.4.1、REDIS_SERVER_NAME目标

该目标依赖于REDIS_SERVER_OBJ,而REDIS_SERVER_OBJ的内容都是一些目标文件(上面代码有给出),这些目标文件最终都会通过3.2小节介绍的那个target来生成。可以看到REDIS_SERVER_NAME这个target需要使用REDIS_SERVER_OBJ…/deps/hiredis/libhiredis.a…/deps/lua/class="lazy" data-src/liblua.a以及FINAL_LIBS这些来编译链接生成最终的目标文件,即redis-server

3.4.2、REDIS_SENTINEL_NAME目标

可以看到REDIS_SENTINEL_NAME目标很简单,只是简单地使用install命令复制了REDIS_SERVER_NAME目标生成的那个文件,即redis-server,从这里可以知道哨兵服务redis-sentinelRedis服务使用的是同一套代码

3.4.3、REDIS_CHECK_RDB_NAME目标

和前面的如出一辙,也是简单复制了redis-server文件到redis-check-rdb文件去

3.4.4、REDIS_CHECK_AOF_NAME目标

和前面的如出一辙,也是简单复制了redis-server文件到redis-check-aof文件去

3.4.5、REDIS_CLI_NAME目标

这个就不是简单复制了,而是使用和REDIS_SERVER_NAME目标相同的方法进行直接编译的,唯一的区别是REDIS_SERVER_NAME链接了…/deps/lua/class="lazy" data-src/liblua.a,而REDIS_CLI_NAME链接的是…/deps/linenoise/linenoise.o

3.4.6、REDIS_BENCHMARK_NAME目标

这个也是使用和REDIS_SERVER_NAME目标相同的方法进行直接编译的,唯一的区别是REDIS_SERVER_NAME链接了…/deps/lua/class="lazy" data-src/liblua.a,而REDIS_BENCHMARK_NAME链接的是…/deps/hdr_histogram/hdr_histogram.o

3.5、all目标

经过前面的介绍,all目标的作用也就一目了然了,最终会生成六个可执行文件,以及输出相应的调试信息
代码如下:

all: $(REDIS_SERVER_NAME) $(REDIS_SENTINEL_NAME) $(REDIS_CLI_NAME) $(REDIS_BENCHMARK_NAME) $(REDIS_CHECK_RDB_NAME) $(REDIS_CHECK_AOF_NAME)
	@echo ""
	@echo "Hint: It's a good idea to run 'make test' ;)"
	@echo ""

3.6、安装和卸载Redis的目标

3.6.1、安装Redis的目标

这里逻辑很简单,先创建一个用于存放Redis可执行文件的文件夹(默认是/usr/local/bin),然后将REDIS_SERVER_NAMEREDIS_BENCHMARK_NAMEREDIS_CLI_NAME对应的可执行文件复制到/usr/local/bin中去,这里可以看到前面那几个照葫芦画瓢的文件并没有复制过去,而是直接通过创建软连接的方式去生成对应的可执行文件(内容相同,复制过去浪费空间)
代码如下:

PREFIX?=/usr/local
INSTALL_BIN=$(PREFIX)/bin

install: all
	@mkdir -p $(INSTALL_BIN)
	$(REDIS_INSTALL) $(REDIS_SERVER_NAME) $(INSTALL_BIN)
	$(REDIS_INSTALL) $(REDIS_BENCHMARK_NAME) $(INSTALL_BIN)
	$(REDIS_INSTALL) $(REDIS_CLI_NAME) $(INSTALL_BIN)
	@ln -sf $(REDIS_SERVER_NAME) $(INSTALL_BIN)/$(REDIS_CHECK_RDB_NAME)
	@ln -sf $(REDIS_SERVER_NAME) $(INSTALL_BIN)/$(REDIS_CHECK_AOF_NAME)
	@ln -sf $(REDIS_SERVER_NAME) $(INSTALL_BIN)/$(REDIS_SENTINEL_NAME)

3.6.2、卸载Redis的目标

这里就是删除前面复制的那些文件了,比较简单,就不细讲了
代码如下:

uninstall:
	rm -f $(INSTALL_BIN)/{$(REDIS_SERVER_NAME),$(REDIS_BENCHMARK_NAME),$(REDIS_CLI_NAME),$(REDIS_CHECK_RDB_NAME),$(REDIS_CHECK_AOF_NAME),$(REDIS_SENTINEL_NAME)}

3.7、clean和distclean目标

所有Makefileclean或者distclean目标的作用都是大致相同的,就是删除编译过程中产生的那些中间文件,以及最终编译生成的动态库、静态库、可执行文件等等内容,代码比较简单,就不作过多的分析了
代码如下:

clean:	rm -rf $(REDIS_SERVER_NAME) $(REDIS_SENTINEL_NAME) $(REDIS_CLI_NAME) $(REDIS_BENCHMARK_NAME) $(REDIS_CHECK_RDB_NAME) $(REDIS_CHECK_AOF_NAME) *.o *.gcda *.gcno *.gcov redis.info lcov-html Makefile.dep dict-benchmark	rm -f $(DEP).PHONY: clean

distclean: clean
	-(cd ../deps && $(MAKE) distclean)
	-(rm -f .make-*).PHONY: distclean

3.8、test目标

执行完Redis编译之后,会有一段提示文字我们可以运行make test测试功能是否正常,从代码中我们可以看出其实不止一个test目标,还有另一个test-sentinel目标,这个是测试哨兵服务的。这两个目标分别运行了根目录的runtestruntest-sentinel文件,这两个是脚本文件,里面会继续调用其他脚本来完成整个功能的测试,并输出测试信息到控制台。具体怎么测试的就不分析了,大家有兴趣的可以去看一下。
代码如下:

test: $(REDIS_SERVER_NAME) $(REDIS_CHECK_AOF_NAME) $(REDIS_CLI_NAME) $(REDIS_BENCHMARK_NAME)
	@(cd ..; ./runtest)test-sentinel: $(REDIS_SENTINEL_NAME) $(REDIS_CLI_NAME)
	@(cd ..; ./runtest-sentinel)

4、总结

本文详细地分析了与Redis编译相关的Makefile文件,通过学习Makefile文件里的内容,我们可以更为全面地了解Redis的编译过程,因为Makefile文件中将很多编译命令用@给取消显示了,转而使用它自己特制的编译信息输出给我们看,代码如下:

ifndef V
QUIET_CC = @printf '    %b %b\n' $(CCCOLOR)CC$(ENDCOLOR) $(class="lazy" data-srcCOLOR)$@$(ENDCOLOR) 1>&2;
QUIET_LINK = @printf '    %b %b\n' $(LINKCOLOR)LINK$(ENDCOLOR) $(BINCOLOR)$@$(ENDCOLOR) 1>&2;
QUIET_INSTALL = @printf '    %b %b\n' $(LINKCOLOR)INSTALL$(ENDCOLOR) $(BINCOLOR)$@$(ENDCOLOR) 1>&2;
endif

所以我们直接去编译的话很多细节会看不到,可以自己尝试修改Makefile文件,在前面这段代码之前定义V变量,这样就可以看到完整的编译信息了。修改如下:

V = 'good'

ifndef V
QUIET_CC = @printf '    %b %b\n' $(CCCOLOR)CC$(ENDCOLOR) $(class="lazy" data-srcCOLOR)$@$(ENDCOLOR) 1>&2;
QUIET_LINK = @printf '    %b %b\n' $(LINKCOLOR)LINK$(ENDCOLOR) $(BINCOLOR)$@$(ENDCOLOR) 1>&2;
QUIET_INSTALL = @printf '    %b %b\n' $(LINKCOLOR)INSTALL$(ENDCOLOR) $(BINCOLOR)$@$(ENDCOLOR) 1>&2;
endif

本人之前也写过Nginx编译相关的文章,下面总结两者的几点区别:

  • Nginx使用了大量的Shell相关的技术,而Redis则很少使用这些

  • Nginx跨平台的相关参数是通过配置脚本进行配置的,而Redis则是直接在Makefile文件中将这件事给做了,这两者没有什么优劣之分,Nginx主要是为了可扩展性强才使用那么多配置脚本的,而Redis基本不用考虑这些,所以简单一点实现就行了

  • 由于Redis将其一些逻辑都放在了Makefile文件中了,所以看起来Nginx最终生成的Makefile文件要比Redis简单易懂很多(Nginx复杂逻辑在那些配置脚本里)

  • Nginx生成的配置文件足有1000多行,代码量比Redis的400多行要大很多,因为Nginx把全部依赖的生成方式全部列举了出来,而Redis借助了Makefile.dep、各种%.d文件来将依赖信息分散到中间文件中去,极大地减少了Makefile的代码量

感谢各位的阅读!关于“Redis中Makefile文件是什么”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Redis中Makefile文件是什么

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

makefile文件编写的方法是什么

编写Makefile文件有以下几个步骤:1. 确定目标文件:Makefile文件中首先需要确定要生成的目标文件(可执行文件、库文件等)。2. 定义依赖关系:确定目标文件所依赖的源文件和其他目标文件。3. 编写规则:为每个目标文件编写规则,即
2023-09-12

linux中的makefile是什么

makefile是一个文件,用于指导编译器执行源代码文件的编译和链接过程。它是GNU make工具的配置文件,用来描述源代码文件之间的依赖关系和编译规则。makefile中包含了一系列的规则,每个规则定义了一个目标文件和其对应的依赖文件以及
2023-08-22

什么是makefile(3)

继续(2)的内容:六、另类风格的makefile 即然我们的make可以自动推导命令,那么我看到那堆[.o]和[.h]的依赖就有点不爽,那么多的重复的[.h],能不能把其收拢起来,好吧,没有问题,这个对于make来说很容易,谁叫它提供
2023-01-31

linux中makefile指的是什么

小编给大家分享一下linux中makefile指的是什么,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!在linux中,makefile是一个工程文件的编译规则,描
2023-06-21

linux中makefile的作用是什么

makefile是一个用于自动化编译和构建源代码的脚本文件。它指定了源代码文件之间的依赖关系以及如何编译和链接这些文件,从而帮助开发人员更方便地进行代码的管理和构建。具体来说,makefile的作用包括以下几个方面:1. 自动化编译:通过m
2023-09-12

linux怎么运行makefile文件

在Linux系统中,可以通过以下命令运行Makefile文件:1. 打开终端。2. 导航到包含Makefile文件的目录。可以使用`cd`命令切换目录。3. 运行以下命令来运行Makefile文件:```make```4. Make工具将根
2023-09-12

linux怎么新建makefile文件

在Linux系统中,使用文本编辑器(如vi、nano等)可以新建makefile文件。以下是一种常见的方法:1. 打开终端。2. 进入要新建makefile文件的目录,可以使用`cd`命令进行切换。3. 执行以下命令来创建新的makefil
2023-09-17

makefile怎么读取文件内容

在Makefile中,你可以使用`$(shell)`函数来读取文件内容。假设你的文件名为`file.txt`,你可以使用以下命令来读取文件内容:```makefilecontent := $(shell cat file.txt)```上述
2023-09-12

linux中怎么使用make指定makefile文件

在Linux中,可以使用`make -f`命令来指定使用的Makefile文件。下面是具体的步骤:1. 打开终端。2. 进入包含Makefile文件的目录。3. 在终端中输入以下命令: ``` make -f
2023-09-22

Linux系统中makefile的原理是什么

这篇文章主要为大家分析了Linux系统中makefile的原理是什么的相关知识点,内容详细易懂,操作细节合理,具有一定参考价值。如果感兴趣的话,不妨跟着跟随小编一起来看看,下面跟着小编一起深入学习“Linux系统中makefile的原理是什
2023-06-28

cmake和makefile区别是什么

CMake和Makefile都是构建和管理C/C++项目的工具,但是它们有一些重要的区别。Makefile是一种脚本文件,用于定义项目的构建规则和依赖关系。它使用一种称为GNU Make的构建工具来执行这些规则,根据文件的时间戳和依赖关系自
2023-08-16

Go怎么编写Makefile规则文件

这篇“Go怎么编写Makefile规则文件”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Go怎么编写Makefile规则文件
2023-06-30

redis是什么软件

redis 是一种内存驻留的键值对数据库,具有以下特点:内存驻留,高速读写;存储键值对,键唯一,对应任意类型数据;提供多种数据结构,满足不同需求;高可用,支持复制和哨兵模式;分布式部署,处理大数据和高并发。Redis 是一种开源内存数据库,
redis是什么软件
2024-04-08

makefile怎么生成可执行文件

要将C或C++代码编译成可执行文件,可以使用Makefile来实现。以下是一个简单的Makefile示例,用于将一个名为"hello.c"的C文件编译成可执行文件"hello":```hello: hello.cgcc -o hello h
2023-09-12

makefile的语法结构是什么

Makefile的语法结构主要包括以下几个部分:1. 目标(Target):Makefile中的目标指定了要生成的文件或者执行的动作。目标的语法格式通常是`target: prerequisites`,其中`target`表示目标文件,`p
2023-09-12

oracle中dmp文件是什么文件

在Oracle中,DMP文件是一种数据库导出文件,它包含了数据库的结构和数据。DMP文件可以用于备份和还原数据库,以及将数据从一个数据库迁移到另一个数据库。DMP文件可以通过使用Oracle的数据泵工具(如expdp和impdp)进行导出和
2023-08-30

makefile执行的方法是什么

要执行Makefile,可以使用以下方法:1. 在命令行中使用`make`命令:在Makefile所在的目录下打开命令行,输入`make`命令,然后按下回车键。Make工具会自动查找当前目录下的Makefile文件,并根据其中的规则执行相应
2023-09-12

编程热搜

目录