回 帖 发 新 帖 刷新版面

主题:如何在makefile(nmake使用的makefile)中加入依赖文件的搜索路径

下面是我写的简单的makefile文件(nmake使用)

hello1.exe: hello1.obj
    link /debug /debugtype:cv /pdb:none /subsystem:windows hello1.obj
hello1.obj: hello1.asm
    ml /c /Zi /coff hello1.asm
    
我的源文件[color=FF0000]hello1.asm[/color]在D:\exercise\code中,我现在的当前目录是D:\exercise\makefile。
我要如何修改才能让nmake找到我的源文件hello1.asm啊?目标文件默认会生成到那个路径?如果也想指定该怎么该呢(比如D:\exercise\App)?

回复列表 (共2个回复)

沙发

对于vc下的nmake我没用过,所以下面的方法不一定可以帮您.
如果使用的是GNU-make的话,可以用vpath来指定文件的搜索目录,如:
vpath   %.c   d:\foo\src      # 如果在默认目录没找到,.c文件将在这里找
vpath   %.asm d:\exercise\App # 同上,在这里找.asm文件

不过上面的只针对与依赖文件,并不能让编译器知道要到那里去找源代码文件。
其实make和编译器不一样,make只是一个工具。它可以理解为一个解释器,对指定的Makefile文件中的规则进行解释执行,根据文件的生成规则,确定某个文件是不是需要更新,如果要则调用shell执行某个命令。

我给您几点建议:
  1. 最好不要把Makefile文件和源文件放到不同的目录。
  2. 如果工程比较大,最好分成比较小的部分,每个部分写一个Makefile,在工程顶目录写一个Makefile,然后从顶层Makefile在调用子Makefile.把一些公共部分的参数写到顶层目录的某个文件,然后用include把它分别包含进Makefile中。

如:在d:\exercise这个大工程,分很多个小工程,App1,App2,App3.
 1. 在d:\exercise写一个文件叫Makefile.inc,用来设置编译器等参数。内容是:
         AS     = ml
         # 汇编编译器
         ASFLAGS = /c /Zi /coff
         # 汇编编译器的参数
         LD      = link
         # 连接器
         LDFLAGS = /debug /debugtype:cv /pdb:none /subsystem:windows
         # 连接器参数

         .SUFFIXES: .obj .asm
         .asm.obj: ; $(AS) $(ASFLAGS) -o $@ $^
         # 建立.obj .asm后缀文件的默认生成规则

  2. 在d:\exercise目录下写一个总的Makefile.内容如下:
         include ./Makefile.inc
         # 把Makefile.inc包含进这个Makefile中来

         .PHONY: App1 App2 App3
         all: App1 App2 App3
         App1:;( cd App1  &&  make all )
         App2:;( cd App2  &&  make all )
         App3:;( cd App3  &&  make all )

  3. 在每个App子目录分别写Makefile.
     如在App1中写一个Makefile,内容为:
         #include ../Makefile.inc
         # 把顶层目录中的公共参数Makefile.inc包含进这个文件

         OBJS = hello1.obj
         all: hello1.exe
         hello1.exe: $(OBJS) ; $(LD) $(LDFLAGS) -o $@ $^

  4. 以后需要生成总工程exercise,只要使用cd命令进入exercise目录,然后执行make all就行了。如果只要生成总工程下的子工程App1,那么只要执行make App1.

  这样的好处就是整个工程非常清晰,并且灵活性好。比如您写的C语言代码本来是用VC编译的,别人拿到您的代码,但他只安装了gcc,那么只要在Makefile.inc中CC CFLAGS(默认情况,分别表示C语言编译器,C语言编译器的参数)这两个参数稍做修改就行了。

板凳


谢谢了虽然不太明白呵呵[em8]

我来回复

您尚未登录,请登录后再回复。点此登录或注册