什么是LINK.cpp / COMPILE.cpp变量适用于make?

时间:2017-03-24 13:19:23

标签: 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将始终链接之前的库,因为我只能在之后添加我的目标文件,并且会导致错误就像发布的问题一样。

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

  • CXXFLAGS
  • CPPFLAGS

,两者似乎都不对。 我是否弄错了变量的用例?

要明确:问题不是针对链接器可能会给您带来的错误,而是针对make中变量的使用。

1 个答案:

答案 0 :(得分:2)

  

我通常将我的库存储在LDFLAGS变量中,我认为这是常见的

这是一个相当常见的错误。传统的含义 使用C或C ++编译的变量是: -

  • 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显然出现在内置规则中 预期意义目标架构选项,但尚未记录。)