2011-04-03 56 views
0

對於一個學校項目,我需要創建一個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

想一想:'SRCS = sub/file1.c sub/file2.c ...'並從目標中刪除'cd's – pmg 2011-04-03 17:30:00

+0

謝謝你的工作!但是我現在有第二個問題,我無法在不使用其他makefile的情況下同時編譯兩個二進制文件。 – Aymeric 2011-04-03 18:07:40

回答

1

使用以下(記得把製表符而不是空格的行開始):

all: $(NAME) $(NAME2) 

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

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

當我這樣做時,我得到以下錯誤:「沒有任何事情要做」。 – Aymeric 2011-04-03 18:23:42

+1

@Ephismen這不是一個錯誤信息;這意味着「全部」(全部)已經完成。 – anatolyg 2011-04-03 18:50:08

+0

我犯了兩個錯誤:首先,我給你的錯誤信息是錯誤的,其次我在Makefile中隱藏了一個空間,所以我想知道它來自哪裏。無論如何非常感謝你,它完美的作品! – Aymeric 2011-04-03 18:58:45

2

看到這篇文章:

Make Tutorial: How-To Write A Makefile

它解釋了一切,包括爲什麼不使用遞歸而不是如何做。

您將特別想要閱讀:Recursive Make Considered Harmful,它解釋了爲什麼遞歸make不好以及避免它的方法。

+0

的確,Stack Overflow [關於](http://stackoverflow.com/q/319764/2509)上的[several](http://stackoverflow.com/q/559216/2509)問題遞歸與非遞歸make包括一些發展良好的基於​​製造的構建系統的鏈接。 – dmckee 2011-04-03 18:41:08

+0

本教程不好,例如得出以下結論:_So,您仍然需要調用「make clean」...約99%的時間_ – anatolyg 2011-04-03 19:02:56