就在我问这个问题之前: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/