C 为模块化项目编写makefile:Make

C 为模块化项目编写makefile:Make,c,gcc,makefile,C,Gcc,Makefile,我正在尝试学习makefile,下面是我的模块化项目结构: $ pwd /cygdrive/d/Make/Code $ ls -R | grep ":$" | sed -e 's/:$//' -e 's/[^-][^\/]*\//--/g' -e 's/^/ /' -e 's/-/|/' . |-Build |-Conversion |---bin |-----exe |-----obj |---include |---lib |---m

我正在尝试学习makefile,下面是我的模块化项目结构:

$ pwd
/cygdrive/d/Make/Code
$ ls -R | grep ":$" | sed -e 's/:$//' -e 's/[^-][^\/]*\//--/g' -e 's/^/   /' -e 's/-/|/'
   .
   |-Build
   |-Conversion
   |---bin
   |-----exe
   |-----obj
   |---include
   |---lib
   |---make
   |---source
   |-Main
   |---bin
   |-----exe
   |-----obj
   |---include
   |---lib
   |---make
   |---source
   |-Reverse
   |---bin
   |-----exe
   |-----obj
   |---include
   |---lib
   |---make
   |---source
三个模块是1)转换2)反向3)主模块<代码>生成文件对于每个模块,这些模块被放置在各自的
生成
文件夹中,它们正确地准备相应的
.o
文件,并将它们放置在各自文件夹的
bin/obj

生成目录用于生成
.exe
文件,如下所示:

$ cat makefile
all:
        cd ../Conversion/make; make
        cd ../Reverse/make; make
        cd ../Main/make; make

Conversion:
        cd ../Conversion/make; make

Reverse:
        cd ../Reverse/make; make

Main:
        cd ../Main/make; make


exeApp:
        cd ../Main/make; make App

cConversion:
        cd ../Conversion/make; make clean

cReverse:
        cd ../Reverse/make; make clean

cMain:
        cd ../Main/make ; make clean

cleanAll:
        cd ../Conversion/make; make clean
        cd ../Reverse/make; make clean
        cd ../Main/make; make clean
main的
makefile
是:

#VPATH= ./../source
INCLUDES= ./../include
OBJDIR= ./../bin/obj
EXEDIR= ./../bin/exe
OBJLOOKDIR= ./../../Conversion/bin/obj:./../../Reverse/bin/obj:./../../Main/bin/obj
#CONBIN= ./../../Conversion/bin/obj
#REVBIN= ./../../Reverse/bin/obj
#MAINBIN= ./../../Main/bin/obj

vpath %.h $(INCLUDES)
vpath %.o $(OBJLOOKDIR)
vpath %.c ./../source

CC= gcc
CFLAGS= -Wall -c -I$(INCLUDES)

OBJECTS= driver.o
PROJECTOBJECTS= binary.o hex.o octal.o reverseNum.o driver.o

main: $(OBJECTS)

driver.o:  driver.c conversion.h
        $(CC) $(CFLAGS) $< -o $(OBJDIR)/$@

App:  $(PROJECTOBJECTS)
        $(CC) -Wall $< -o $(EXEDIR)/$@

clean:
        rm -rf $(OBJDIR)/*.o *~ $(EXEDIR)/*
以下规则说明了如何将其转换为:

$ pwd
/cygdrive/d/Make/Code/Main/make
Gaurav@Gaurav-PC /cygdrive/d/Make/Code/Main/make

$ gcc -Wall ./../../Conversion/bin/obj/binary.o ./../../Conversion/bin/obj/hex.o ./../../Conversion/bin/obj/octal.o ./../../Reverse/bin/obj/reverseNum.o ./../../Main/bin/obj/driver.o -o Trial

Gaurav@Gaurav-PC /cygdrive/d/Make/Code/Main/make
$ ls
makefile  makefileold  Trial.exe
如上规则编译文件,但
exeApp
规则仅翻译为
gcc-Wall./../Conversion/bin/obj/binary.o-o./../bin/exe/App
。它应该是到
gcc-Wall./../Conversion/bin/obj/binary.o./../Conversion/bin/obj/hex.o./../Conversion/bin/obj/octal.o./../Reverse/bin/obj/reverseNum.o./../Main/bin/obj/driver.o-o./../bin/exe/App

我不知道为什么

有人能帮忙吗


谢谢

我不确定这是否是您的问题,但请尝试替换
cd的所有实例;用
$(make)-C任何东西制作
。(然后读取并重写相应的makefile。从长远来看,这将更容易调试,效果更好。)@Zack问题是
App:$(PROJECTOBJECTS)$(CC)-Wall$<-o$(EXEDIR)/$@
只被翻译成
gcc-Wall./../Conversion/bin/obj/binary.o-o./../bin/exe/App
。使用
$@Zack和
App:$(EXEAPP)$(CC)-Wall$(EXEAPP)-o$(EXEDIR)/$@
,而不是使用
vpath%.o$(OBJLOOKDIR)
我必须给出实际路径
EXEAPP=../../../Conversion/bin/obj/binary.o./../Conversion/bin/obj/hex.o\../../Conversion/bin/obj/octall.o./../Reverse/bin/obj/reverseNum.o\../../Main/bin/obj/driver.o
@Zack我想我用过
$
$
$ pwd
/cygdrive/d/Make/Code/Main/make
Gaurav@Gaurav-PC /cygdrive/d/Make/Code/Main/make

$ gcc -Wall ./../../Conversion/bin/obj/binary.o ./../../Conversion/bin/obj/hex.o ./../../Conversion/bin/obj/octal.o ./../../Reverse/bin/obj/reverseNum.o ./../../Main/bin/obj/driver.o -o Trial

Gaurav@Gaurav-PC /cygdrive/d/Make/Code/Main/make
$ ls
makefile  makefileold  Trial.exe