4

Using nmake, is it possible to have the makefile build all the .cpp files in the current directory automatically, without having to specify them individually?

So, instead of something like:

O = $(OBJ_DIR)/main.obj
{$(SOURCE_DIR)}.cpp{$(OBJ_DIR)}.obj:
    ---COMPILE $< HERE---

I'd like to avoid having to specify each obj to make. Can this be done?

4

5 回答 5

2

只是

main.exe: *.c resource.RES
    @$(MAKE) $(**:.c=.obj)
    link $(**:.c=.obj) /OUT:$@

你不需要添加任何东西!每次你nmake*.c都会检查它是否被编译。

细节:

  • $**对于依赖项
  • $@为目标
  • $(**:.c=.obj)是字符串替代品,将.c后缀替换为.obj. 说到resource.RES,它不会取代任何东西。

请注意,有一个递归调用,这是最优雅的方法。否则,有必要以*.c脚本之类的方式获取所有文件名。

于 2020-08-08T13:54:41.437 回答
1

您可以使用这样的规则:

{src\mystuff}.c{tmp\src\mystuff}.obj::
    $(CC) /nologo $(CFLAGS) /c /Fotmp\src\mystuff\ $<

它将查找并编译所有.c文件src\mystuff并将目标文件放入tmp\src\mystuff. 代替你.cpp.c情况。

请注意,第二行的第一个字符应该是制表符,而不是空格。

此外,$(CC)由 nmake 预定义为cl,您可以根据需要添加任何编译器标志$(CFLAGS),在规则中对其进行硬编码或添加不同的变量。

于 2009-05-08T20:41:40.170 回答
1
.cpp.obj:
    $(CC) $(CFLAGS) $*.cpp

是一个默认规则,它将自动从 .cpp 文件中解析 .obj 依赖项...

于 2009-05-08T20:46:36.150 回答
0

一种可能性是将 make 包装在脚本中。

要么使用 for 循环,在每个 .cpp 文件上调用 make,要么构造一个 cpp 文件列表并将其用作 makefile 的参数。

于 2009-06-06T02:56:40.083 回答
0

您可以在 nmakefile 预处理期间运行 shell 命令,然后运行!include输出。自然地,输出需要采用 nmake 格式。就像是:

!if [bash -c "echo O = *.cpp" >sources.mak]
!error Failed to generate source list
!endif
!include sources.mak

all: $(O:.cpp=.obj)

.cpp.obj:
    ---COMPILE $< HERE---

我怀疑大多数人不会使用bash来创建sources.mak,但你明白了。

于 2011-01-07T15:57:09.390 回答