在makefile

时间:2017-09-28 00:17:53

标签: makefile

首先,有问题的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) $<

基本上这将首先制作一些目标文件,然后将它们链接在一起。我认为这在语义上是不合理的,因为:

  1. 顾名思义,LDFLAGS适用于ld,但此处没有标记。如果我们需要一些像OpenGL这样的外部库,那么像-LGL这样的标志会传递给g++,然后g++会将它传递给链接器。在这种情况下,将-LGL放入LDFLAGS是合理的。

  2. 即使我们将-Wall等标志放入LDFLAGS,也没有多大意义。这种标志直观地用于编译过程,而不是链接(除非我理解这个过程是错误的)。

  3. https://www.gnu.org/software/make/manual/html_node/Implicit-Variables.html中,有一段代码$(CC) -c $(CFLAGS) $(CPPFLAGS),它明确地传递-c。我认为这是更好的方法 - 将所有编译标志(例如-Wall)放入CXXFLAGS,并明确传入-c以进行目标文件编译。当然,网页并没有说这段代码肯定是更好的,也不是唯一的方法。

  4. 所以我能想到使用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默认为空字符串,因此我们仍然可以将其用于链接步骤。

    但是我不确定我是不对。

1 个答案:

答案 0 :(得分:1)

你是对的,编译标志与LDFLAGS无关。只需明确定义LDFLAGS,以便另一个编辑 - 或者自己,经过一段时间后 - 可以一眼看出1.它是空的,2。在哪里修改它(比如添加-s到它,这很常见。)