【问题标题】:makefile/nmake : strip out folder bits from the file listmakefile/nmake :从文件列表中删除文件夹位
【发布时间】:2010-12-08 01:24:56
【问题描述】:

我有一个 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,这似乎不起作用。

非常感谢任何解决此问题的想法。谢谢。

【问题讨论】:

标签: c++ makefile nmake


【解决方案1】:

$(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

希望对您有所帮助。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 宏替换没有帮助,但自动变量和文件修饰符可以。
    【解决方案3】:

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

    1. 尝试使用文本函数,直到获得所需的结果。您没有说 $(notdir...) 做了什么,但也许您可以使用 $(patsubst...) 或 $(subst...)、$(字...)和$(字...)。
    2. 从一开始就省略路径。如果 CPP_SOURCE 不包含路径,那么 CPP_OBJS 也不包含。使用 VPATH 告诉 make 在哪里可以找到源代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-08
      • 1970-01-01
      • 2013-05-23
      • 1970-01-01
      相关资源
      最近更新 更多