在我提出这个问题之前不久: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变量? 候选人是:
,两者似乎都不对。 我是否弄错了变量的用例?
要明确:问题不是针对链接器可能会给您带来的错误,而是针对make中变量的使用。
答案 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
显然出现在内置规则中
预期意义目标架构选项,但尚未记录。)