GNU makefile规则和依赖项

时间:2015-03-13 20:53:56

标签: c++ linux makefile gnu-make

我一直在阅读有关如何编写makefile以在Linux上构建应用程序的大量内容,但我对于显然实现相同目标的许多不同方法感到非常困惑。

到目前为止,我已经提出建立档案。

SHELL = /bin/sh

CXX = g++
DEBUG = -g
CXXFLAGS = -std=c++11 -Wall -pedantic #-Wextra
CPPFLAGS =  -I. \
            -I./include

SOURCES =   foo1.cpp \
            foo2.cpp \
            foo3.cpp

OBJECTS = $(SOURCES:.cpp=.o)

以下规则成功将每个源文件编译为目标文件,然后创建存档:

libfoo.a: $(OBJECTS)
    ar rvcs $@ $(OBJECTS)

%.o: src/%.cpp ./include/%.h
    $(CXX) -c $(CPPFLAGS) $(CXXFLAGS) -o $@ $< 

这也是做同样的事情:

libfoo.a: $(OBJECTS)
    ar rvcs $@ $(OBJECTS)

$(OBJECTS) : %.o:src/%.cpp
    $(CXX) -c $(CPPFLAGS) $(CXXFLAGS) -o $@ $< 

然而,这失败了,因为没有规则可以制作目标&#39; foo1.o:%。h

libfoo.a: $(OBJECTS)
    ar rvcs $@ $(OBJECTS)

$(OBJECTS) : %.o:src/%.cpp %.o:%.h
    $(CXX) -c $(CPPFLAGS) $(CXXFLAGS) -o $@ $< 

有人可以解释为什么它不起作用,哪种方法最好?

第一个选项将头文件列为依赖项,但第二个选项不是。这是我第三种选择的动机。

如何使用选项2或3将标题列为依赖项?

TIA

1 个答案:

答案 0 :(得分:0)

您在试用#2和试用#3中使用的功能是static pattern rules,语法如下:

<targets...> : <target-pattern> : <prerequisites...>

只能有两个冒号,而不是三个冒号。你应该把你的尝试#3写成:

$(OBJECTS) : %.o : src/%.cpp %.h
        $(CXX) -c $(CPPFLAGS) $(CXXFLAGS) -o $@ $< 

请注意一件重要的事情:如果您创建任何具有关联的.cpp文件的.h文件,则此规则将失败。就这么说吧。