[英]Makefile overriding default implicit rule
为什么此规则无法覆盖默认的隐式规则?
当调用make时: make myapp
(假设myapp.c在那里)。 make运行默认命令来构建和链接程序,而不是此隐式规则中定义的命令:
#... omitted code
LCUS=$(LIBS)/libcus.a
#... omitted code
% : %.o $(LCUS)
echo !!! Custom build !!!
$(MY_CMD) $< -o $@ $(LCUS)
摘自GNU在线make
手册 :
您可以通过定义具有相同目标和先决条件但具有不同命令的新模式规则来覆盖内置隐式规则(或您自己定义的规则)。
所以我认为这是因为先决条件与隐式规则不同。
还可以从make
手册中获取:
联的单个对象文件
n
自动地从由no
通过运行接头(通常称为ld
通过C编译器)。 使用的精确命令是$(CC) $(LDFLAGS) no $(LOADLIBES) $(LDLIBS)
。 对于只有一个源文件的简单程序,此规则是正确的。 如果有多个目标文件(可能来自各种其他源文件),其中一个名称与可执行文件的名称相匹配,它也会做正确的事情。 从而,x: yo zo
当
xc
,yc
和zc
都存在时将执行:cc -c xc -o xo cc -c yc -o yo cc -c zc -o zo cc xo yo zo -ox rm -f xo rm -f yo rm -f zo
所以基本上make
理解为从生成的程序文件潜规则.o
文件,但是当你在你的静态库扔它不理解。 一种简单的测试方法是从依赖项中删除$(LCUS)
(作为临时措施),看它是否使用您的规则而不是内置规则。 如果确实如此,那么你知道这是你的问题。 如果只是添加myapp
替换%
是一个问题,因为您希望规则构建多个目标,您可以尝试以下方法:
$(APPS): % : %.o $(LCUS)
其中$(APPS)
是一个包含您要构建的所有应用程序的变量。 这将允许一个规则构建多个目标。 您也可以完全跳过变量的使用并放置一个以空格分隔的列表。 这是静态模式规则的示例,可以在此处找到更多信息。 静态模式和隐式规则之间的区别可以在这里找到。
您的规则与内置隐式规则不同,因此不会取消它。
此外,make始终优先选择不需要将中间文件构建到其中的规则。 如果你预先创建.a
文件make可能会使用你的规则(但它甚至可能不会)。
如果您取消内置规则并保留规则,我认为它应该正常工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.