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

标签 c++ makefile

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

相关文章:

c++ - 英特尔 SGX 将 c++ 类/结构作为 void* 传递给 enclave 并将其强制转换回来

c++ - 读取二进制文件并转换为整数数组时出现问题

c++ - 将两个相似的 make 规则减少为一个通用规则

c++ - 使用多个类、额外的预先存在的 .a 库和其他依赖项制作库

makefile 将特定变量作为先决条件

c++ - const 临时类型的最佳实践

c++ - #include <cmath> : "In FIle included from" error message?

c++ - 将文件添加到 Qrc 资源

gnu-make - makefile 中的自动依赖生成

makefile - 使用 -fPIC 重新编译