我这里有一个简单的 makefile。这是一个最小的 c++ 项目,我希望 make 使用隐式规则执行正确的行为。 用下面的makefile,会报错。然后我输入“make -n”,看起来 make 使用的是 cc 而不是 cxx。 但是当我检查 GNU 页面时,它说 CXX 是一个隐式变量: https://www.gnu.org/software/make/manual/html_node/Implicit-Variables.html
我可以说最终目标。隐式工具总是cc?
objects = test.o main.o
CXX=g++
CFLAGS=-std=c++11
test: $(objects)
.PHONY: clean
clean:
rm -f *.o test
最佳答案
很可能您的目标文件正在与 Make 的默认链接器链接,即 $(CC)
。我们可以看到,如果我们查看 make --print-data-base -f/dev/null
的输出 - 特别是:
%: %.o # recipe to execute (built-in): $(LINK.o) $^ $(LOADLIBES) $(LDLIBS) -o $@
如果我们查看 LINK.o
的定义,我们会看到:
# default LINK.o = $(CC) $(LDFLAGS) $(TARGET_ARCH)
幸运的是,Make 提供 LINK.cc
正是为了我们的目的:
# default LINK.cc = $(CXX) $(CXXFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH)
所以我们需要做的就是将 LINK.o
重新定义为 LINK.cc
的值,链接将由我们的 C++ 编译器完成:
LINK.o = $(LINK.cc)
如果我们有多个目标,要以不同方式链接,我们可能会使用目标相关变量来定位效果:
test: LINK.o = $(LINK.cc)
关于 makefile 的其他评论:
test
是一个糟糕的程序名称 - 很容易错误地运行标准/usr/bin/test
。- 您的意思可能是
CXXFLAGS=-std=c++11
(不是CFLAGS
)。 - 所有 makefile 都应包含一个
.DELETE_ON_ERROR:
目标,这样被中断的命令就不会留下显示为最新的部分输出。
关于c++ - make 如何推断最终目标需要什么样的编译器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46709427/