我有一个make文件,它使用模式匹配来使用如下规则自动编译:
%.o : %.c
gcc -c $<
然而,在这个项目中,我有许多源文件,它们的扩展名有所不同。有没有办法匹配make文件中的集合,就像在正则表达式中一样。
伪示例:
%.o : %.[cC]
gcc -c $<
不可能简单地更改源文件的大小写,因为这用于模块测试现有项目,该项目混合了其他几个模块。
答案 0 :(得分:1)
我找到了解决方案。事实证明,makefile有几个问题。
首先,我发布的例子实际上就像班塔尔指出的那样。但是我的问题是我的源文件不在根目录中,而是在我添加到vpath的src /子目录中。老实说,我认为这与我的问题无关,因为我相信make会自动扫描其源文件的vpath。原来vpath不适用于规则检查。
要使其正常工作,请执行以下操作:
vpath = %.c src
vpath = %.C src
%o : src/%.[Cc]
gcc -c $<
接下来,当我正在研究如何完成它的示例时,make有时会在我背后构建源文件。如果你这样做:
all : main.o
gcc -o test main.o
...并且没有规则来构建.o文件make将使用隐式inbuild规则构建它。相当混乱。可以使用-r标志禁用它。
make -r all
使用gcc编译.C文件而没有任何额外选项将导致链接器错误,因为gcc将.C文件解释为C ++文件为默认值。为了编译为C文件,请使用-x标志。
%.o : %.C
gcc -x c -c %<
希望这有助于某人。
答案 1 :(得分:0)
我能看到的最简单的选择就是链接不匹配的案例:
%.c : %.C
ln $< $@
让规则链完成剩下的工作。