makefile + gcc in windows

1 安装Mingw

make文件是mingw32-make, 不是很方便,可以创建make的快捷方式

2 makefile 例子(编译JCVM CREF):

TARGET = cref

VERSION = 1.0.0

CC = gcc

# includes file

INCLUEDS := -I ./h

INCLUEDS += -I ./32

# C FLAGS

CFLAGS := -Wall -DWIN32 \

-D_WIN32 \

-D_MBCS \

-D_CONSOLE \

-D_DEBUG \

-DBIT32 \

-DINTERFACE_T1 \

-luser32 \

-lgdi32 \

-lkernel32 \

-lmsvcrt \

-lwsock32


 

# source file contain

SRC_FILES := ./c/*.c

SRC_FILES += ./32/*.c

OBJ_DIR = output

SOURCES := $(wildcard $(SRC_FILES)) #wildcard 处理通配符符, 通配符会被自动展开。但在变量的定义和函数引用时,通配符将失效。这种情况下如果需要通配符有效,就需要使用函数“wildcard”

#OBJECT = $(patsubst %.c, %.o, $(SOURCES))

OBJECT := $(addprefix $(OBJ_DIR)/,$(notdir $(patsubst %.c,%.o,$(SOURCES))))

VPATH= ./c:./32 #Makfile 关键字,指定源文件搜索路径,%.C搜索的时候很关键

all: $(TARGET)

# echo $(SOURCES)

# echo "\r\n" all $(OBJECT)

$(TARGET): $(OBJECT)

@echo generate $(TARGET)_$(VERSION).exe #@ 不打印命令

@$(CC) $^ $(CFLAGS) -o $(TARGET)_$(VERSION).exe

$(OBJECT): $(OBJ_DIR)/%.o: %.c # 静态模式,多目标,

@echo building $<

@$(CC) $(INCLUEDS) $(CFLAGS) -c $< -o $@

.PHONY : clean

clean:

del .\output\*.o #windows下面要用反斜杠 “\”

del .\c\*.o

del .\32\*.o

静态模式:

态模式可以更加容易地定义多目标的规则,可以让我们的规则变得更加的有弹性和灵活。我们还是先来看一下语法:

 :  : 
    
    ...

targets定义了一系列的目标文件,可以有通配符。是目标的一个集合。

target-pattern是指明了targets的模式,也就是的目标集模式。

prereq-patterns是目标的依赖模式,它对target-pattern形成的模式再进行一次依赖目标的定义。

这样描述这三个东西,可能还是没有说清楚,还是举个例子来说明一下吧。如果我们的定义成 %.o ,意思是我们的;集合中都是以 .o 结尾的,而如果我们的定义成 %.c ,意思是对所形成的目标集进行二次定义,其计算方法是,取模式中的 % (也就是去掉了 .o 这个结尾),并为其加上 .c 这个结尾,形成的新集合。

所以,我们的“目标模式”或是“依赖模式”中都应该有 % 这个字符,如果你的文件名中有 % 那么你可以使用反斜杠 \ 进行转义,来标明真实的 % 字符。

看一个例子:

objects = foo.o bar.oall: $(objects)$(objects): %.o: %.c
    $(CC) -c $(CFLAGS) $< -o $@

上面的例子中,指明了我们的目标从$object中获取, %.o 表明要所有以 .o 结尾的目标,也就是 foo.o bar.o ,也就是变量 $object 集合的模式,而依赖模式 %.c 则取模式 %.o% ,也就是 foo bar ,并为其加下 .c 的后缀,于是,我们的依赖目标就是 foo.c bar.c 。而命令中的 $<$@ 则是自动化变量, $< 表示第一个依赖文件, $@ 表示目标集(也就是“foo.o bar.o”)。于是,上面的规则展开后等价于下面的规则:

foo.o : foo.c
    $(CC) -c $(CFLAGS) foo.c -o foo.obar.o : bar.c
    $(CC) -c $(CFLAGS) bar.c -o bar.o

试想,如果我们的 %.o 有几百个,那么我们只要用这种很简单的“静态模式规则”就可以写完一堆规则,实在是太有效率了。“静态模式规则”的用法很灵活,如果用得好,那会是一个很强大的功能。再看一个例子:

files = foo.elc bar.o lose.o$(filter %.o,$(files)): %.o: %.c
    $(CC) -c $(CFLAGS) $< -o $@$(filter %.elc,$(files)): %.elc: %.el
    emacs -f batch-byte-compile $<

$(filter %.o,$(files))表示调用Makefile的filter函数,过滤“$files”集,只要其中模式为“%.o”的内容。其它的内容,我就不用多说了吧。这个例子展示了Makefile中更大的弹性。

  • 20
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在软件开发中,Makefile是一种用于管理源代码编译和构建的工具。它是一个包含一系列规则和命令的文本文件,用于指定如何生成目标文件。与之相似的,Dockerfile是用于构建Docker镜像的脚本文件Makefile和Dockerfile有一定的关系,可以通过在Makefile中引用或读取Dockerfile来完成自动构建的目的。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Makefile + Dockerfile](https://blog.csdn.net/yujia_666/article/details/121251081)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [Makefile中@+-的含义](https://blog.csdn.net/weixin_37988926/article/details/103964750)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [Makefile中 := ?= += =的区别](https://blog.csdn.net/yikunbai5708/article/details/101999352)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值