2

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 文件工作正常。(ie) 在 make 文件中 vpath=./sub。

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

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

整体地图为:

有一个名为 dir 的目录

子目录 dir/sub1

目录/子2

目录/sub3

主文件在 dir/sub1/src/main.c

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

仅编译 sub1 并创建 sub1exe

仅复制 sub2 并创建 sub2exe。

制作文件将是

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

我必须进行哪些更改而不是 $(wildcard *.c)。

4

1 回答 1

1

这篇文章似乎回答了你的问题:Makefile 中的子目录的来源

试试 SRCS = $(wildcard *.c) $(wildcard **/*.c)

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

顺便说一句,您是否已经尝试过 CMake?

于 2013-09-04T08:15:43.950 回答