尝试练习,因为我需要稍后编写一个makefile。 我有以下文件夹结构
./Folder1/header1.h
./Folder1/src1.c
./Folder2/header2.h
./Folder2/src2.c
main.c
Makefile
每个文件的代码如下
那么header1.h
#include <stdio.h>
void print_1();
header2.h
#include <stdio.h>
void print_1();
src1.c
#include <header1.h>
void print_1() {
printf("This is function1\n");
}
src2.c
#include <header2.h>
void print_2() {
printf("This is function2\n");
}
的main.c
#include <header1.h>
#include <header2.h>
int main(int argc, char **argv) {
print_1();
print_2();
return 0;
}
生成文件
CC=gcc
VPATH=./Folder1:./Folder2
OUT_FILE=test
%.o : %.c
$(CC) -c $< -o $@
all : %.o
目前,想法是使用VPATH变量生成目标文件。规则%.o : %.c
应该告诉每个源文件生成目标文件(它们应该在Makefile和main.c的相同级别返回)。
第二条规则应该具有目标文件的先决条件,因此它应该调用第一条规则。
然而它不起作用,为什么?
(自从我上一个makefile以来已经有一段时间了。)
答案 0 :(得分:1)
您不能all
取决于%.o
- 百分比是针对模式规则的,并且所有都不是模式规则。你想要这样的东西:
CC=gcc
DIRS=Folder1 Folder2
CFILES=$(foreach dir,$(DIRS),$(wildcard $(dir)/*.c))
OFILES=$(CFILES:.c=.o)
%.o : %.c
$(CC) -c $< -o $@
all : $(OFILES)
CFILES
将包含目录中的c文件,OFILES
将是要生成的.o文件列表。模式规则足够智能,可以填写目录名称。
答案 1 :(得分:-1)
这对我有用,但本身并不充分,因为VPATH变量只影响make,而不影响编译器。您需要修改.c文件中的#include语句,以告诉编译器在哪里找到头文件。
CC=cc
VPATH=./Folder1:./Folder2
OUT_FILE=test
all : main
%.o : %.c
$(CC) -c $<
main : src1.o src2.o main.o
$(CC) $^ -o $@