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中更大的弹性。

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-06 21:44:01       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-06 21:44:01       106 阅读
  3. 在Django里面运行非项目文件

    2023-12-06 21:44:01       87 阅读
  4. Python语言-面向对象

    2023-12-06 21:44:01       96 阅读

热门阅读

  1. docker内容整理

    2023-12-06 21:44:01       58 阅读
  2. 找丢失号码(桶排序)

    2023-12-06 21:44:01       46 阅读
  3. 最近爆火的向量数据库是怎么回事儿?

    2023-12-06 21:44:01       58 阅读
  4. C#无标题栏窗体拖动方法

    2023-12-06 21:44:01       48 阅读
  5. 字节面试题 小于n的最大数

    2023-12-06 21:44:01       58 阅读
  6. docker安装mysql8

    2023-12-06 21:44:01       55 阅读
  7. 数据在内存中的存储

    2023-12-06 21:44:01       58 阅读
  8. linux下的抓包实现

    2023-12-06 21:44:01       56 阅读
  9. heatmap.js热力图【vue3】

    2023-12-06 21:44:01       47 阅读