src = $(wildcard ./*.c) #obj = $(patsubst %.c, %.o, $(src)) obj = $(src:%.c=%.o)
时间: 2024-04-28 18:22:24 浏览: 316
这是一个Makefile中的变量定义,用于自动化编译C程序。其中,$(wildcard ./*.c)是通配符函数,用于查找当前目录下所有以.c为后缀名的文件,并将文件名列表存储在变量src中。$(patsubst %.c, %.o, $(src))是模式替换函数,用于将src变量中的.c文件替换成.o文件,并将替换后的文件名列表存储在变量obj中。另一种写法$(src:%.c=%.o)是变量替换函数,用于将变量src中的.c文件替换成.o文件,并将替换后的文件名列表存储在变量obj中。最终,变量obj中存储了当前目录下所有以.c为后缀名的文件所对应的.o文件名列表,这些.o文件可以作为编译目标文件的依赖项。
相关问题
工程目录文件包括./src/main.c和./src/ParseConfig.c和./lib/ParseConfig.h编写一个MakeFile文件,分别实现以下要求: 1. 执行make static_release命令, 生成的ParseConfig自动strip,并且不依赖libParseConfig.so 2. 执行make debug_release命令, ParseConfi不strip,并且不依赖libParseConfig.so
好的,让我来回答你的问题。根据你的要求,需要编写一个Makefile文件来实现两个不同的编译模式,分别是static_release和debug_release。下面是一个可能的Makefile文件的示例:
```
CC = gcc
CFLAGS = -Wall -Wextra -Werror -pedantic -std=c99
LDFLAGS = -static
SRC_DIR = ./src
LIB_DIR = ./lib
SRC_FILES = $(wildcard $(SRC_DIR)/*.c)
OBJ_FILES = $(patsubst $(SRC_DIR)/%.c, $(SRC_DIR)/%.o, $(SRC_FILES))
LIB_FILES = $(LIB_DIR)/libParseConfig.so
static_release: CFLAGS += -O2
static_release: LDFLAGS += -s
static_release: $(SRC_DIR)/main
$(CC) $(CFLAGS) $(LDFLAGS) $(OBJ_FILES) -o $@
debug_release: CFLAGS += -g
debug_release: $(SRC_DIR)/main
$(CC) $(CFLAGS) $(LDFLAGS) $(OBJ_FILES) -L$(LIB_DIR) -lParseConfig -o $@
$(SRC_DIR)/main: $(OBJ_FILES)
$(SRC_DIR)/%.o: $(SRC_DIR)/%.c
$(CC) $(CFLAGS) -c $< -o $@
.PHONY: clean
clean:
rm -f $(OBJ_FILES) static_release debug_release
```
这个Makefile文件定义了两个目标,即`static_release`和`debug_release`。`static_release`目标会在编译时添加`-O2`优化选项和`-s`参数来进行strip,并且不依赖于`libParseConfig.so`库文件。`debug_release`目标则没有strip,并且需要链接`libParseConfig.so`库文件。
Makefile文件中的变量定义如下:
- `CC`:编译器命令
- `CFLAGS`:编译器选项
- `LDFLAGS`:链接选项
- `SRC_DIR`:源代码目录
- `LIB_DIR`:库文件目录
- `SRC_FILES`:源代码文件列表
- `OBJ_FILES`:目标文件列表
- `LIB_FILES`:库文件列表
Makefile文件中的规则如下:
- `static_release`和`debug_release`:这两个目标都依赖于`$(SRC_DIR)/main`目标文件和所有的`$(OBJ_FILES)`目标文件。`static_release`目标会在编译时添加`-O2`优化选项和`-s`参数来进行strip,并且不依赖于`libParseConfig.so`库文件。`debug_release`目标则没有strip,并且需要链接`libParseConfig.so`库文件。
- `$(SRC_DIR)/main`:这个目标依赖于所有的`$(OBJ_FILES)`目标文件。这个规则会链接所有的目标文件生成可执行文件。
- `$(SRC_DIR)/%.o`:这个规则将每个源代码文件编译为目标文件。
- `clean`:清除所有的目标文件和可执行文件。
希望这个Makefile文件能够满足你的需求。
现在有以下文件./ ├── bin ├── inc │ ├── add.h │ ├── div.h │ ├── mul.h │ └── sub.h ├── Makefile ├── obj └── src ├── add.c ├── div.c ├── mul.c ├── sub.c └── test.c./ ├── bin ├── inc │ ├── add.h │ ├── div.h │ ├── mul.h │ └── sub.h ├── Makefile ├── obj └── src ├── add.c ├── div.c ├── mul.c ├── sub.c └── test.c编写Makefile生成可执行文件test
以下是可能的Makefile文件:
```
CC = gcc
CFLAGS = -Wall -Wextra -pedantic -std=c11
SRCDIR = src
INCDIR = inc
OBJDIR = obj
BINDIR = bin
SOURCES = $(wildcard $(SRCDIR)/*.c)
OBJECTS = $(patsubst $(SRCDIR)/%.c,$(OBJDIR)/%.o,$(SOURCES))
INCLUDES = -I$(INCDIR)
TARGET = $(BINDIR)/test
all: $(TARGET)
$(TARGET): $(OBJECTS)
$(CC) $(CFLAGS) $(INCLUDES) $^ -o $@
$(OBJDIR)/%.o: $(SRCDIR)/%.c
$(CC) $(CFLAGS) $(INCLUDES) -c $< -o $@
clean:
rm -f $(OBJDIR)/*.o $(TARGET)
```
这个Makefile假设你的源代码文件在src目录中,头文件在inc目录中,可执行文件将被编译到bin目录中,目标文件将被编译到obj目录中。如果你想改变这些位置,你需要修改Makefile中的相应变量。
要编译代码,只需在终端中运行`make`。如果一切顺利,你将得到一个名为test的可执行文件。要清除所有目标文件和可执行文件,可以运行`make clean`。
阅读全文