首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >模式规则和VPATH、makefile

模式规则和VPATH、makefile
EN

Stack Overflow用户
提问于 2016-11-01 17:11:40
回答 2查看 937关注 0票数 1

试着练习一下,因为我需要稍后写一个makefile。我有以下文件夹结构

代码语言:javascript
复制
./Folder1/header1.h
./Folder1/src1.c
./Folder2/header2.h
./Folder2/src2.c
main.c
Makefile

每个文件的代码如下

header1.h

代码语言:javascript
复制
#include <stdio.h>

void print_1();

header2.h

代码语言:javascript
复制
#include <stdio.h>

void print_1();

src1.c

代码语言:javascript
复制
#include <header1.h>

void print_1() {
   printf("This is function1\n");
}

src2.c

代码语言:javascript
复制
#include <header2.h>

void print_2() {
   printf("This is function2\n");
}

main.c

代码语言:javascript
复制
#include <header1.h>
#include <header2.h>

int main(int argc, char **argv) {
   print_1();
   print_2();
   return 0;
}

Makefile

代码语言:javascript
复制
CC=gcc
VPATH=./Folder1:./Folder2
OUT_FILE=test

%.o : %.c
    $(CC) -c $< -o $@

all : %.o

目前的想法是让使用VPATH变量生成对象文件。规则%.o : %.c应该告诉我们,对于每个源文件,生成对象文件(它们应该在Makefile和main.c的相同级别返回)。

第二个规则应该有一个先决条件--对象文件,所以它应该调用第一个规则。

但是它不起作用,为什么?

(我的上一个makefile已经有一段时间了)。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-11-01 18:34:13

您不能让all依赖于%.o --百分比是用于模式规则的,而不是模式规则。你想要这样的东西:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2016-11-01 18:06:20

这对我来说是有效的,但它本身是不够的,因为VPATH变量只影响make,而不影响编译器。需要修改.c文件中的#include语句,以便告诉编译器在哪里找到头文件。

代码语言:javascript
复制
CC=cc
VPATH=./Folder1:./Folder2
OUT_FILE=test

all : main

%.o : %.c
        $(CC) -c $<

main : src1.o src2.o main.o
        $(CC) $^ -o $@
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40365073

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档