如何在子目录中使用Makefile进行编译?

时间:2011-04-03 17:26:33

标签: c makefile

对于学校项目,我需要创建一个Makefile来编译子目录,而不使用任何其他Makefile。我的意思是我不允许这样做:

make -C <sub-folder>

以下是它的样子:

在当地:

   ./Makefile
   ./sub
   ./sub2

在子目录中:

   ./sub/file1.c
   ./sub/file2.c
   ./sub/file3.c
   ./sub/file4.c

   ./sub2/file1.c
   ./sub2/file2.c
   ./sub2/file3.c
   ./sub2/file4.c

这是我到目前为止所做的,但我一直都会遇到错误:

CC              =       gcc -W -Wall -Werror

NAME            =       test

NAME2           =       test2

SRCS            =       sub/file1.c            \
                        sub/file2.c            \
                        sub/file3.c            \
                        sub/file4.c

SRCS2           =      sub2/file1.c            \
                        sub2/file2.c            \
                        sub2/file3.c            \
                        sub2/file4.c

OBJS            =       $(SRCS:.c=.o)

OBJS2           =       $(SRCS2:.c=.o)

all:
    $(OBJS)
    $(CC) $(OBJS) -o $(NAME)

    $(OBJS2)
    $(CC) $(OBJS2) -o $(NAME2)                                                                          

谢谢你,Ephismen。

[编辑]编辑我的问题 我的问题有所改变。我需要在同一个Makefile中编译,总是使用相同的规则,两个不同的二进制文件。我尝试了一下对一个有用的东西,但它似乎不适合两个。如果您有任何建议,请告诉我。

发布的代码有效,但只编译第一个二进制文件。

2 个答案:

答案 0 :(得分:2)

参见这篇文章:

Make Tutorial: How-To Write A Makefile

它解释了所有内容,包括为什么不使用递归make和如何做包括。

你特别想阅读:Recursive Make Considered Harmful解释了为什么递归make很糟糕以及避免它的方法。

答案 1 :(得分:1)

使用以下内容(记得在行的开头放置制表符而不是空格):

all: $(NAME) $(NAME2)

$(NAME): $(OBJS)
    $(CC) $(OBJS) -o $(NAME)

$(NAME2): $(OBJS2)
    $(CC) $(OBJS2) -o $(NAME2)