将项目目录树中的所有对象文件传递给makefile中的规则



我有一个makefile,看起来像这个

CC=gcc
CFLAGS=-pedantic -ansi -Wall -O2
TARGET=assembler
SUBDIRS = utils preprocessor parser symbols
.PHONY: clean all subdirs $(SUBDIRS)
subdirs: $(SUBDIRS)
$(SUBDIRS):
$(MAKE) -C $@
all: subdirs
clean: 
for dir in $(SUBDIRS); do 
$(MAKE) -C $$dir clean; 
done

我想添加

$(TARGET): subdirs $(TARGET).c
$(CC) $(CFLAGS) $(TARGET).c -o $@

但后来我得到了链接错误,因为子目录中的对象文件找不到。有没有一种方法可以传递项目根目录下的所有对象文件?

是否有方法将所有对象文件传递到项目根目录下?

单词"的用法;通过";表明您的makefiles和make操作的心理模型完全错误。Makefile是规范,而不是脚本,其中的规则不是函数,也不像函数那样操作。除其他外,显式规则的目标和先决条件是在解析makefile时确定的,而不是在(考虑(规则执行时动态确定的。

因此,您所建议的操作完全不可行,因为当make启动时,您不能依赖任何对象文件(它们是构建的文件(来存在。你有鸡和蛋的问题。

我完全同意@Andreas的观点,即在makefile中使用globbing和类似的动态目标或先决条件检测是不好的*命名的目标和先决条件应该显式命名(不排除将它们分配给变量或使用替换引用或类似方法(。但是,如果您确实使用了globbing或其他形式的动态检测来定位文件,那么您应该定位与项目一起分发的文件,而不是构建的文件。

如果您想保持递归make构建系统的模块性(这绝不是一个明显的胜利(,那么一个合理的选择是让每个子目录中的make构建一个以目录名命名的静态归档。顶层makefile则不需要知道子目录makes的任何细节;它只包括链接中每个链接产生的静态库。


*这有多种原因,但它们与手头的问题无关。

最新更新