我有一些“可选”代码:没有它也可以链接程序的其余部分。
如果在创建目标文件时出现错误,我如何正确创建一个将其排除为依赖项的 Makefile?
到目前为止,我有这样的东西:
OUT=my_program
OBJS=$(subst .cc,.o,$(wildcard *.cc))
all: $(OUT)
$(OUT): $(OBJS)
my_optional_file.o: other_target
.IGNORE: my_optional_file.o
好处:在处理规则 my_optional_file.o
时,这会正确地忽略所有错误。
坏处:当链接输出时,my_optional_file.o
被指定为链接器的参数尽管事实它不是构建的,这使得链接器失败,因为它被赋予了一个不存在的文件作为输入!
构建时出现错误,如何排除 my_optional_file.o
?
最佳答案
使用 $(shell find . -maxdepth 1 -iname "*.o")
显式调用链接器。
喜欢:
$(OUT): $(OBJS)
$(CXX) $(LDFLAGS) $(shell find . -maxdepth 1 -iname "*.o") $(LDLIBS) -o $@
原因是当隐式调用时,链接器命令是这样调用的:
$(CXX) $(CXXFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH) $^ $(LOADLIBES) $(LDLIBS) -o $@
$^
扩展为 $(OBJS)
的内容。您需要显式调用才能改用特定文件。
$(wildcard *.o)
函数无法使用,因为它在文件创建之前执行,因此它始终为空。
关于c++ - Makefile 中的 "Optional"目标文件目标?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23822156/