使用nmake,是否可以让makefile自动构建当前目录中的所有.cpp文件,而不必单独指定它们?
所以,而不是像:
O = $(OBJ_DIR)/main.obj
{$(SOURCE_DIR)}.cpp{$(OBJ_DIR)}.obj:
---COMPILE $< HERE---
我想避免指定要制作的每个obj。可以这样做吗?
答案 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
。