【问题标题】:GNU Make: Using % in a pattern-rule macroGNU Make:在模式规则宏中使用 %
【发布时间】:2012-06-03 04:19:21
【问题描述】:

我正在尝试构建一个模式规则,允许我在宏调用中使用 %,但我没有得到预期的结果。

模式规则:

%.o: %.cpp $(%_H)
    g++ -o $@ $(FLAGS) -c $<

问题在于 $(%_H)

由于某种原因,% 没有扩展到它的定义范围。

当我打印出依赖列表($^)时,只打印源文件。

我有一种非常简洁的方式来设置我想使用的依赖项:

# Header Dependencies per object 
Geometry_H:=Geometry.h $(Error_H) 
Enemy_H:=Enemy.h $(Geometry_H) $(Error_H) 
Surface_H:=Surface.h $(Geometry_H) 
Player_H:=Player.h $(Geometry_H) $(Surface_H) 
SDLWindow_H:=SDLWindow.h $(Surface_H) $(Error_H) 
Path_H:=Path.h $(Geometry_H) $(Error_H) 
Territory_H:=Territory.h $(Geometry_H) 
Board_H:=Board.h $(Territory_H) $(Geometry_H) $(Player_H) $(Path_H) $(Enemy_H) $(Error_H) 
Error_H:=Error.h 
Diminisher_H:=Diminisher.h $(SDLWindow_H) $(Geometry_H) $(Surface_H) $(Board_H) $(Error_H) 
Main_H:=$(Diminisher_H)

另一个人建议我将这些变量更改为依赖列表。

即 Main_H:=$(Diminisher_H)

变成 Main.o: $(Diminisher_H)

这是一个很好的修复,它有效。 但是,问题仍然存在,$(%_H) 在某种程度上是无效的。

我想知道如何(如果可能的话)使它成为一个有效的表达式。

我已经尝试过$( $%_H )、$( $(%)_H )、$( $(value %)_H ) 等等。 似乎% 在宏调用中失去了意义。

有没有办法在宏调用中使用%?

【问题讨论】:

    标签: variables macros makefile


    【解决方案1】:

    要么使用secondary expansion:

    .SECONDEXPANSION:
    
    %.o: %.cpp $$($$*_H)
        g++ -o $@ $(FLAGS) -c $<
    

    或者(IMO,更好)使用依赖自动生成:

    【讨论】:

    • 谢谢。二次扩展成功了。但是,当我尝试使用 $$($$%_H) 时,问题仍然存在。只有当我使用 $$($$*_H) 时,表达式才会正确扩展。看起来 GNU make 可能不喜欢 % 在宏调用中使用?另外,我很欣赏额外的信息。有时我需要升级到自动依赖生成……也许不适合这个项目。
    • @SexyBachelor 百分号在模式规则中具有特殊含义,请不要使用它。 $* 是automatic variable 并扩展为规则匹配的词干,即百分号。
    猜你喜欢
    • 2022-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-05
    • 1970-01-01
    • 2017-09-26
    相关资源
    最近更新 更多