0

我有一个makefile(使用nmake & VC++ 2005):

CPP_OBJS = $(CPP_SOURCE:.cpp=.obj)


$(TARGET) : $(CPP_OBJS)
    $(link) $(ldebug) $(lflags) /DLL \
    $(LIBPATHS) \
    $out:$@ $(CPP_OBJS) $(conlibs)  

问题是链接步骤失败,因为 $(CPP_OBJS) 被扩展到文件列表中,其中每个文件名都带有一个文件夹名称(这样它是从 CPP_SOURCE 生成的)。由于所有 .obj 文件都在当前文件夹中(编译结果) - link.exe 无法找到 .objs。

我需要类似的东西:(我在这里找到它:http ://uw714doc.sco.com/cgi-bin/info2html?%28make.info%29File%2520Name%2520Functions&lang=en )

`$(notdir NAMES...)' 提取 NAMES 中每个文件名的目录部分以外的所有内容。如果文件名不包含斜线,则保持不变。否则,通过最后一个斜线的所有内容都将被删除。

但那件事似乎不适用于 VC++ 2005 附带的 NMAKE。

非常感谢任何如何克服这个问题的想法。谢谢你。

4

3 回答 3

2

$(notdir)不适用于您,因为这是 GNU make 功能,而您正在使用 NMAKE。

我并不完全清楚您要做什么,但您的问题的简短答案是使用带有文件修饰符的 NMAKE 自动变量。在这种情况下$(**),是目标的所有先决条件列表,添加F修饰符将删除目录名称。例如:

CPP_SOURCE=subdir/foo.cpp subdir/bar.cpp
CPP_OBJS=$(CPP_SOURCE:.cpp=.obj)
all: $(CPP_OBJS)
        @echo Unmodified: $(**)
        @echo Filenames only: $(**F)

假设您有一个subdir包含文件的目录foo.objbar.obj,这将打印:

Unmodified: subdir/foo.obj subdir/bar.obj
Filenames only: foo.obj bar.obj

希望有帮助。

于 2010-12-07T17:24:56.917 回答
0

由于nmake不支持'$(notdir NAMES ...)'并且它的宏替换不支持从源文件名中轻松删除文件夹层次结构,是否可以更改编译以输出目标文件到与源相同的文件夹中?

cpp.obj:
    $(CC) $(CFLAGS) /c /Fo $*.obj $*.cpp

我不是 nmake 专家,但我相信这可以帮助您克服这个问题。

于 2009-12-16T07:00:19.533 回答
-1

我不太了解 NMAKE(我使用 GNU Make),但我认为您基本上有两种选择:

  1. 试验文本功能,直到你得到你想要的。您没有说 $(notdir...) 做了什么,但也许您可以使用 $(patsubst...) 或 $(subst...)、$(字...)和$(字...)。
  2. 从一开始就省略路径。如果 CPP_SOURCE 不包含路径,那么 CPP_OBJS 也不包含。使用VPATH告诉 make 在哪里可以找到源代码。
于 2009-12-09T15:50:21.977 回答