我有一个 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 中每个文件名的目录部分以外的所有内容。 如果文件名不包含斜线,则保持不变。 否则,从最后一个斜线开始的所有内容都会从中删除。
但是对于 VC++ 2005 附带的 NMAKE 似乎不起作用。
非常感谢任何解决此问题的想法。谢谢。
最佳答案
$(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)
假设您有一个包含文件 foo.obj
和 bar.obj
的目录 subdir
,这会打印:
Unmodified: subdir/foo.obj subdir/bar.obj
Filenames only: foo.obj bar.obj
希望对您有所帮助。
关于c++ - 生成文件/nmake : strip out folder bits from the file list,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1871179/