使用NMAKE在目录中创建所有源?

时间:2009-05-08 20:15:28

标签: c++ makefile visual-c++ nmake

使用nmake,是否可以让makefile自动构建当前目录中的所有.cpp文件,而不必单独指定它们?

所以,而不是像:

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

我想避免指定要制作的每个obj。可以这样做吗?

6 个答案:

答案 0 :(得分:3)

.cpp.obj:
    $(CC) $(CFLAGS) $*.cpp

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

答案 1 :(得分:0)

您可以使用以下规则:

{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)添加所需的任何编译器标记,在规则中对其进行硬编码或添加其他变量在那里,你喜欢。

答案 2 :(得分:0)

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

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

答案 3 :(得分: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,但你明白了。

答案 4 :(得分:0)

只是

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

,您无需添加其他任何内容!每次nmake时,都会检查所有*.c是否已编译。

$**表示依赖性,$@表示目标。

$(**:.c=.obj)是字符串替换,将.c后缀替换为.obj。而当涉及到resource.RES时,它将不会替代任何东西。

请注意,存在递归调用。这是最优雅的方法,否则您可以调用cmd将所有*.c文件名打印到文本并从中加载。

答案 5 :(得分:-2)

我认为这可以通过GNU make中的通配符完成(而IIRC可以在Windows上运行)。除此之外,我很抱歉,但我不知道nmake