gpt4 book ai didi

c++ - make 如何推断最终目标需要什么样的编译器?

转载 作者:行者123 更新时间:2023-11-28 04:58:14 27 4
gpt4 key购买 nike

我这里有一个简单的 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com