首先,有问题的makefile大致看起来像这样(我正在写下我的记忆):
CXX=g++
CXXFLAGS=-c -Wall -std=c++11 -O3
LDFLAGS=-Wall -std=c++11 -O3
all: clean car.out
clean:
rm -f *.o *.out
car.out: a.o b.o
$(CXX) -o $@ $(LDFLAGS) $^
a.o: a.cpp
$(CXX) $(CXXFLAGS) $<
b.o: b.cpp
$(CXX) $(CXXFLAGS) $<
基本上这将首先制作一些目标文件,然后将它们链接在一起。我认为这在语义上是不合理的,因为:
顾名思义,LDFLAGS
适用于ld
,但此处没有标记。如果我们需要一些像OpenGL这样的外部库,那么像-LGL
这样的标志会传递给g++
,然后g++
会将它传递给链接器。在这种情况下,将-LGL
放入LDFLAGS
是合理的。
即使我们将-Wall
等标志放入LDFLAGS
,也没有多大意义。这种标志直观地用于编译过程,而不是链接(除非我理解这个过程是错误的)。
在https://www.gnu.org/software/make/manual/html_node/Implicit-Variables.html中,有一段代码$(CC) -c $(CFLAGS) $(CPPFLAGS)
,它明确地传递-c
。我认为这是更好的方法 - 将所有编译标志(例如-Wall
)放入CXXFLAGS
,并明确传入-c
以进行目标文件编译。当然,网页并没有说这段代码肯定是更好的,也不是唯一的方法。
所以我能想到使用LDFLAGS
的唯一原因是因为“有一个链接步骤”,这对我来说没有多大意义。在我看来,上面的makefile应该是:
CXX=g++
CXXFLAGS=-Wall -std=c++11 -O3
all: clean car.out
clean:
rm -f *.o *.out
car.out: a.o b.o
$(CXX) -o $@ $(LDFLAGS) $^
a.o: a.cpp
$(CXX) -c $(CXXFLAGS) $<
b.o: b.cpp
$(CXX) -c $(CXXFLAGS) $<
LDFLAGS
默认为空字符串,因此我们仍然可以将其用于链接步骤。
但是我不确定我是不对。
答案 0 :(得分:1)
你是对的,编译标志与LDFLAGS
无关。只需明确定义LDFLAGS
,以便另一个编辑 - 或者自己,经过一段时间后 - 可以一眼看出1.它是空的,2。在哪里修改它(比如添加-s
到它,这很常见。)