Nmake 从 .cpp 文件中获取所有 .o 文件的列表

Posted

技术标签:

【中文标题】Nmake 从 .cpp 文件中获取所有 .o 文件的列表【英文标题】:Nmake getting a list of all .o files from .cpp files 【发布时间】:2009-12-17 18:32:12 【问题描述】:

我正在使用 nmake 将多个源文件编译成一个精灵。但是我不想在这样的长列表中指定 .o 文件:

OBJS = file1.o file2.o file3.o

我更喜欢使用通配符,将当前目录中的所有 .o 文件指定为 .elf 的依赖项。但是,在我从 .cpp 文件编译它们之前,.o 文件不存在。有没有办法使用通配符扩展获取 cpp 文件列表,然后进行字符串替换以将 .cpp 替换为 .o。

【问题讨论】:

【参考方案1】:

在 NMAKE 中没有一种特别优雅的方式来执行此操作。如果可以的话,您应该改用 GNU Make,它在 Windows 上可用,并且使许多任务变得更加容易。

如果您必须使用 NMAKE,那么您必须使用递归 make 来自动执行此操作,因为 NMAKE 仅在先决条件列表中扩展通配符。我在回答另一个类似的问题here时演示了如何做到这一点。

希望对您有所帮助。

【讨论】:

【参考方案2】:

我更熟悉 Unix make 和 gmake,但你可以使用:

OBJS = $(SOURCES:.cpp=.o)

(假设您的源文件可以在 SOURCES 中列出)

【讨论】:

这会起作用,但是我会遇到同样的问题,即指定 .cpp 文件列表而不是 .o 文件。我的目标是不必每次添加或删除源文件时都编辑 make 文件。【参考方案3】:

Here 是另一个可能对您有所帮助的答案。

另一种解决方案可能是使用包装批处理文件,您可以在其中使用“for”循环创建所有 .cpp 文件的列表,例如

 del listoffiles.txt
 echo SOURCES= \ >> listoffiles.txt
 for %i in (*.dll) do @echo %i \ >>listoffiles.txt
 echo. >> listoffiles.txt

之后,您可以尝试在 nmake 中将其与 !INCLUDE 预处理器宏一起使用:

 !INCLUDE listoffiles.txt 

(我确信这不会从头开始工作,但总体思路应该很清楚)。

【讨论】:

以上是关于Nmake 从 .cpp 文件中获取所有 .o 文件的列表的主要内容,如果未能解决你的问题,请参考以下文章

nmake:添加带有推理规则的前缀?

使用 nmake 或其他工具(如批处理脚本)从命令行编译 c++

如何在nmake中转义双引号

如何使用 NMake 设置环境变量

使用 NMAKE 编译 VC++ DLL

如何让 nmake 克服错误(make -k 的行为)