主题:如何在makefile(nmake使用的makefile)中加入依赖文件的搜索路径
caier79
[专家分:0] 发布于 2011-05-07 00:20:00
下面是我写的简单的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个回复)
沙发
windy0will [专家分:2300] 发布于 2011-05-07 23:36:00
对于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语言编译器的参数)这两个参数稍做修改就行了。
板凳
caier79 [专家分:0] 发布于 2011-05-08 09:29:00
谢谢了虽然不太明白呵呵[em8]
我来回复