【问题标题】:Use NMAKE to make all source in a directory?使用 NMAKE 制作目录中的所有源代码?
【发布时间】:2009-05-08 20:15:27
【问题描述】:

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

所以,而不是类似的东西:

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

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

【问题讨论】:

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

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


【解决方案1】:

只是

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

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

详情:

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

请注意,有一个递归调用,这是最优雅的方法。否则就需要像脚本一样获取所有*.c文件名。

【讨论】:

  • 谢谢,这应该是公认的答案。
【解决方案2】:

你可以使用这样的规则:

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

它将查找并编译src\mystuff 中的所有.c 文件,并将目标文件放入tmp\src\mystuff。在你的情况下,用.cpp 替换.c。

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

此外,$(CC) 由 nmake 预定义为 cl,您可以将所需的任何编译器标志添加到 $(CFLAGS),将它们硬编码到规则中或在那里添加不同的变量,只要您愿意。

【讨论】:

    【解决方案3】:
    .cpp.obj:
        $(CC) $(CFLAGS) $*.cpp
    

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

    【讨论】:

    • 嗯,不。它只是解释如何去做,并不会导致它被完成。
    • @reinierpost 是的,您在技术上是正确的。整个 makefile 都是如此。它描述了解决依赖关系和产生输出所需的操作。
    • 好吧,我认为您回答的问题与匿名的意思不同,但由于其他人提供相同的答案,我想我错了。
    • @reinierpost,你可能是对的 - 他没有接受任何答案,而且他的问题措辞使得给出的答案可能无法解决他的问题。我没有看到你的答案?也许你应该试一试?
    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

      您可以在 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,但你明白了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-10-05
        • 2015-11-10
        • 2016-12-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多