由头文件greeting.h,greeting2.h、自定义函数文件greeting.c,greeting2.c、主函数文件myapp.c构成的C程序。根据这三个文件的依赖关系,需要编写一个makefile文件
时间: 2023-05-27 11:02:12 浏览: 69
来进行自动化编译。makefile文件的内容如下:
```
# 声明变量
CC = gcc
CFLAGS = -g -Wall
TARGET = myapp
OBJ = greeting.o greeting2.o myapp.o
# 默认规则,生成目标文件
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
# 生成目标文件myapp
$(TARGET): $(OBJ)
$(CC) $(CFLAGS) $^ -o $@
# 依赖关系
greeting.o: greeting.h
greeting2.o: greeting2.h
myapp.o: greeting.h greeting2.h
# 清除文件
clean:
rm -f $(TARGET) $(OBJ)
```
解释一下上面的 makefile 文件:
首先声明了一些变量:
- `CC`:编译器类型
- `CFLAGS`:编译选项
- `TARGET`:目标文件名
- `OBJ`:所有的目标文件
然后定义了一个默认规则,即所有的 .c 文件生成对应的 .o 文件。
接下来定义生成目标文件 myapp 的规则,其依赖于 OBJ 变量中的所有 .o 文件。其中 `$^` 表示所有依赖文件的列表,`$@` 表示当前目标文件名。
最后定义了各个文件的依赖关系,并定义了清除文件的命令。
clang的 makefile 文件类似,只需要将变量 `CC` 改为 `clang` 即可。
相关问题
由头文件greeting.h,greeting2.h、自定义函数文件greeting.c,greeting2.c、主函数文件myapp.c构成的C程序。需要编写一个makefile文件
来编译这个程序。
makefile文件内容如下:
```
CC = gcc
CFLAGS = -Wall
SRCS = greeting.c greeting2.c myapp.c
OBJS = $(SRCS:.c=.o)
TARGET = myapp
all: $(TARGET)
$(TARGET): $(OBJS)
$(CC) $(CFLAGS) -o $(TARGET) $(OBJS)
%.o: %.c
$(CC) $(CFLAGS) -c $<
clean:
rm -f $(TARGET) $(OBJS)
```
makefile文件中:
- CC变量指定编译器为gcc;
- CFLAGS变量指定编译选项为-Wall(开启所有警告信息);
- SRCS变量指定源代码文件列表;
- OBJS变量指定编译生成的目标文件列表;
- TARGET变量指定程序生成的可执行文件名为myapp;
- all指定默认构建命令,即构建myapp可执行文件;
- $(TARGET): $(OBJS)表示myapp依赖于所有目标文件,即greeting.o、greeting2.o和myapp.o;
- $(CC) $(CFLAGS) -o $(TARGET) $(OBJS)表示使用gcc编译目标文件为可执行文件;
- %.o: %.c表示使用gcc将.c源代码文件编译为.o目标文件;
- $(CC) $(CFLAGS) -c $< 表示使用gcc编译源代码文件为目标文件,$<表示当前需要编译的源代码文件;
- clean指定清除命令,即清除所有可执行文件和目标文件。
头文件greeting.h,greeting2.h、自定义函数文件greeting.c,greeting2.c、主函数文件myapp.c。需要编写一个makefile文件
all: myapp
myapp: myapp.o greeting.o greeting2.o
gcc myapp.o greeting.o greeting2.o -o myapp
myapp.o: myapp.c greeting.h greeting2.h
gcc -c myapp.c
greeting.o: greeting.c greeting.h
gcc -c greeting.c
greeting2.o: greeting2.c greeting2.h
gcc -c greeting2.c
clean:
rm *.o myapp