linux系统下已知C语言程序有主程序模块SensorData.c, SensorData.h,其中调用了另一模块MotorCrtl.c, MotorCrtl.h中的功能。试写出一个可将 这两个模块编译成可执行文件Motor_Mem的makefile。
时间: 2024-01-21 22:17:34 浏览: 170
以下是一个可能的Makefile示例:
```
CC=gcc
CFLAGS=-Wall
OBJ1=SensorData.o
OBJ2=MotorCrtl.o
all: Motor_Mem
Motor_Mem: $(OBJ1) $(OBJ2)
$(CC) $(CFLAGS) -o $@ $^
SensorData.o: SensorData.c SensorData.h MotorCrtl.h
$(CC) $(CFLAGS) -c SensorData.c
MotorCrtl.o: MotorCrtl.c MotorCrtl.h
$(CC) $(CFLAGS) -c MotorCrtl.c
clean:
rm -f $(OBJ1) $(OBJ2) Motor_Mem
```
在这个Makefile中,我们首先定义了编译器和编译选项。然后,我们定义了两个目标文件的对象文件名称。我们将这两个文件作为依赖关系传递给Motor_Mem目标,并使用gcc将它们链接在一起来生成可执行文件。
最后,我们为每个源文件定义了编译规则,并提供了相应的头文件依赖关系。我们还提供了一个“clean”目标,以便在需要重新编译时删除所有生成的文件。
相关问题
已知C语言程序有主程序模块SensorData.c, SensorData.h,其中调用了另一模块MotorCrtl.c, MotorCrtl.h中的功能。试写出一个可将 这两个模块编译成可执行文件Motor_Mem的makefile。
以下是一个可能的makefile示例:
```makefile
CC = gcc
CFLAGS = -Wall -Wextra -Werror
LDFLAGS = -lm
SRCDIR = src
OBJDIR = obj
BINDIR = bin
SRCS = $(wildcard $(SRCDIR)/*.c)
OBJS = $(patsubst $(SRCDIR)/%.c,$(OBJDIR)/%.o,$(SRCS))
EXECUTABLE = $(BINDIR)/Motor_Mem
.PHONY: all clean
all: $(EXECUTABLE)
$(EXECUTABLE): $(OBJS)
$(CC) $(LDFLAGS) $^ -o $@
$(OBJDIR)/%.o: $(SRCDIR)/%.c
$(CC) $(CFLAGS) -c $< -o $@
clean:
rm -rf $(OBJDIR)/*.o $(EXECUTABLE)
```
在此示例中,我们假设程序源代码位于名为“src”的目录中,我们想要将生成的可执行文件放在名为“bin”的目录中,而中间文件则存放在名为“obj”的目录中。
我们使用变量来存储不同目录的路径,例如`SRCDIR`用于存放源代码目录的路径,`OBJDIR`用于存放中间文件目录的路径,`BINDIR`用于存放可执行文件目录的路径。
然后,我们使用`wildcard`函数和模式替换来获取所有源文件的列表,并使用`patsubst`函数将每个源文件的路径替换为对应的中间文件路径。
我们使用`$(EXECUTABLE)`目标来生成最终的可执行文件。它依赖于所有中间文件,因此我们使用`$(OBJS)`变量来指定所有中间文件。在链接时,我们使用`$(LDFLAGS)`变量来添加必要的链接标志,例如`-lm`表示链接数学库。
我们使用`$(OBJDIR)/%.o: $(SRCDIR)/%.c`规则来编译每个源文件并生成中间文件。在编译时,我们使用`$(CFLAGS)`变量来添加必要的编译标志。
最后,我们提供一个`clean`目标来清除所有生成的中间文件和最终的可执行文件。
已知C语言程序有主程序模块prog.c,prog.h,其中调用了另一个模块subr.c,subr.h中的功能。试写出一个可将这两个模块编译成可执行文件pr1的makefile。
好的,下面是makefile的内容:
```
CC = gcc
CFLAGS = -Wall -Wextra -c
LFLAGS = -Wall -Wextra
all: pr1
pr1: prog.o subr.o
$(CC) $(LFLAGS) prog.o subr.o -o pr1
prog.o: prog.c prog.h subr.h
$(CC) $(CFLAGS) prog.c -o prog.o
subr.o: subr.c subr.h
$(CC) $(CFLAGS) subr.c -o subr.o
clean:
rm -f *.o pr1
```
解释一下:
- CC是编译器的选择,我们选择了gcc
- CFLAGS是编译选项,我们选择了-Wall -Wextra -c
- LFLAGS是链接选项,我们选择了-Wall -Wextra
- all是makefile的默认目标,即运行“make”指令时会执行的目标,我们这里默认生成pr1
- pr1目标依赖于prog.o和subr.o两个目标
- 对于每个目标,我们使用相应源文件来生成它
- clean是用来清理所有.o和可执行文件的目标
注意:以上makefile中的缩进必须用tab键实现,而不是空格。
阅读全文