makefile - LINK.cpp/COMPILE.cpp 变量在 make 中有何用处?

标签 makefile gnu-make

就在我问这个问题之前:g++ undefined reference to library symbols

看来我滥用了make的预定义变量,即LINK.cpp。 错误是我在对象之前而不是之后链接了库。

现在这就提出了一个问题,这些变量,特别是 LINK.cpp 变量,有什么用处,因为它们像这样扩展:

LINK.cpp = $(LINK.cc)
LINK.cc = $(CXX) $(CXXFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH)
                                          ^

我通常将我的库存储在 LDFLAGS 变量中,我认为这是常见的,因此 LINK.cc 将始终链接 before 之前的库,因为我只能在之后添加我的目标文件,并且会导致错误就像发布的问题一样。

我必须将对象放在哪里才能正确使用 LINK.cpp 变量? 候选人是:

  • CXXFLAGS
  • CPPFLAGS

,这两者似乎都不正确。 我是否错误地理解了变量的用例?

需要明确的是:这个问题并不是针对链接器可能向您抛出的错误,而是针对 make 中变量的使用。

最佳答案

I usually store my libs in LDFLAGS variable, which I thought was common

这是一个相当常见的错误。的常规含义 在 C 或 C++ 编译中出现的 make 变量是:-

  • CFLAGS:C 的编译选项
  • CXXFLAGS:C++ 的编译选项
  • CPPFLAGS:C 或 C++ 的预处理器选项
  • LDFLAGS:链接选项,不包括库 (-l) 选项
  • LDLIBS:用于链接的库或库 (-l) 选项。

这些是GNU Make's builtin rules中假定的含义。 .

变量的预期用途:

LINK.cc = $(CXX) $(CXXFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH)

因此如下:

prog: $(OBJS)
    $(LINK.cc) $^ $(LDLIBS) -o $@

位于目标文件之后。

(变量TARGET_ARCH出现在内置规则中,显然带有 预期含义目标架构选项,但尚未记录)。

关于makefile - LINK.cpp/COMPILE.cpp 变量在 make 中有何用处?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43000565/

相关文章:

build - 从 make 文件中禁用 make 内置规则和变量

makefile - GNU Make 支持文件名中的 '%' 吗?

c++ - 执行make时出错

makefile - 抑制并忽略 Makefile 的输出?

c - 如何在cooja中创建makefile?

gcc - 加速GNU make构建过程-并行性?

c - 告诉 makefile 在不同的目录中搜索 C 头文件

linux - qemu makefile错误找不到我知道的库

unix - Makefile $@ 变量-它是做什么用的?

c++ - g++ 不产生调试符号