模式规则和VPATH,makefile

时间:2016-11-01 17:11:41

标签: c makefile

尝试练习,因为我需要稍后编写一个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以来已经有一段时间了。)

2 个答案:

答案 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 $@