在Makefile中使用vpath和通配符

时间:2013-09-04 07:33:30

标签: c makefile

1)我有一个名为dir的目录,子目录是sub1,sub2,sub3。

2)我想创建一个Makefile,它将编译子目录中的所有源代码。这些是我的makefile的一些行。

CFLAGS = -I/usr/include/ -I./ -ansi -g
GPROF_CFLAGS = -I/usr/include/ -I./
VPATH = ./sub1 ./sub2 ./sub3
SRCS := $(wildcard *.c)
OBJS=$(SRCS:.c=.o)
exe:    $(OBJS)
        $(CC) $(LFLAG) -o exe $(CFLAGS) $(OBJS) -lm 

exe_gprof:
        gcc $(LFLAG) -o exe $(GPROF_SUFFIX) $(GPROF_CFLAGS) $(SRCS)

clean:
        rm -f *.o

clean_all: clean
        rm -f exe exe$(GPROF_SUFFIX) gmon.out Simfir000.stat rm -f *.o.

3)如果我只有名为sub的子文件夹(此目录包含所有源文件)且没有其他子文件夹,则此make文件正常工作。 (即)在make文件中vpath =。/ sub。

4)如果有如我在第1点中提到的子文件夹,则主文件位于sub1 / src / main.c的子文件夹中(即子文件夹内的子文件夹)。如果我尝试编译。它给主要的未定义引用。

5)我必须做什么改变才能成功编译。我们可以在vpath中提供多个目录路径吗?。

整体地图是:

  

目录名为dir

     

子目录dir / sub1

     

DIR / SUB2

     

DIR / SUB3

     

主文件位于dir / sub1 / src / main.c

我的第二个问题是 如果我想按目录执行目录并创建不同的exe

  

仅编译sub1并创建sub1exe

     

仅复制sub2并创建sub2exe。

make文件将是

CFLAGS = -I/usr/include/ -I./ -ansi -g
GPROF_CFLAGS = -I/usr/include/ -I./
VPATH = ./sub1 ./sub2 ./sub3
SRCS1 := $(wildcard *.c)
SRCS2 := $(wildcard *.c)
OBJS=$(SRCS:.c=.o)
exe1:    $(OBJS)
        $(CC) $(LFLAG) -o exe1 $(CFLAGS) $(OBJS) -lm 
exe2:    $(OBJS)
        $(CC) $(LFLAG) -o exe2 $(CFLAGS) $(OBJS) -lm 

exe1_gprof:
        gcc $(LFLAG) -o exe1 $(GPROF_SUFFIX) $(GPROF_CFLAGS) $(SRCS1)
exe2_gprof:
        gcc $(LFLAG) -o exe2 $(GPROF_SUFFIX) $(GPROF_CFLAGS) $(SRCS2)

clean:
        rm -f *.o

clean_all: clean

我必须做出哪些更改而不是$(通配符* .c)。

1 个答案:

答案 0 :(得分:1)

这篇文章似乎回答了你的问题:Sources from subdirectories in Makefile

尝试SRCS = $(通配符* .c)$(通配符** / * .c)

我认为VPATH和通配符不能协同工作,因此您的SRCS没有所有源文件。

顺便问一下,你有没有试过CMake?