c++ - Makefile 中的 "Optional"目标文件目标?

标签 c++ makefile

我有一些“可选”代码:没有它也可以链接程序的其余部分。
如果在创建目标文件时出现错误,我如何正确创建一个将其排除为依赖项的 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/

相关文章:

c++ - 从无序关联容器中移动对象

git - 在 AIX 上构建 git 时 TOC 溢出

c - GNU 使用 stem 制定隐式归档规则

c - 在 Makefile 中运行 unix 命令以解析文本并将其传递给链接行作为定义 -D

c - OSX Mavericks 导致 "cannot specify -o when generating multiple output files"

c++ - 不运行std::min和std::max算法头文件

c++ - 查找 CPU 利用率和 CPU 周期

c++ - 使用带嵌套 vector 的迭代器的意外行为

c++ - C/C++ : libcurl + extended ASCII chars = bad Google Translation API result

linux - 如何从 Makefile 中使用 $ORIGIN 设置 DT_RUNPATH