试着练习一下,因为我需要稍后写一个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;
}Makefile
CC=gcc
VPATH=./Folder1:./Folder2
OUT_FILE=test
%.o : %.c
$(CC) -c $< -o $@
all : %.o目前的想法是让使用VPATH变量生成对象文件。规则%.o : %.c应该告诉我们,对于每个源文件,生成对象文件(它们应该在Makefile和main.c的相同级别返回)。
第二个规则应该有一个先决条件--对象文件,所以它应该调用第一个规则。
但是它不起作用,为什么?
(我的上一个makefile已经有一段时间了)。
发布于 2016-11-01 18:34:13
您不能让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文件的列表。模式规则将足够聪明地填写目录名。
发布于 2016-11-01 18:06:20
这对我来说是有效的,但它本身是不够的,因为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 $@https://stackoverflow.com/questions/40365073
复制相似问题