C ++ makefile同时分离声明和实现

时间:2015-01-02 07:04:56

标签: c++ class makefile

我在main.cpp中用C ++编写了一个简单的小型SQL解释器 代码就像

#include "lexer.h"
#include "parser.h"
#include "interpreter.h"
using namespace std;
int main(int argc, char* argv[]) {
    //my code
}

在lexer.h中,parser.h,interpretor.h,每个都包含一个具有相同名称的头文件的类的声明和实现。我的问题是如何编写我的makefile以便我可以将声明分开和实现,例如,lexer.h中的声明,lexer.cpp中的实现?

1 个答案:

答案 0 :(得分:0)

最简单的方法就是下面的

interpreter: main.cc lexer.cc parser.cc interpreter.cc
         g++ -o interpreter main.cc lexer.cc parser.cc interpreter.cc -I

但有时使用不同的目标很有用。 这是因为如果您修改项目中的单个文件,则不必重新编译所有内容,只需重新编译您修改的内容。所以您可以执行以下操作

使用依赖关系

all: interpreter

interpreter: main.o lexer.o parser.o interpreter.o
    g++ main.o lexer.o parser.o interpreter.o -o interpreter

main.o: main.cc
    g++ -c main.cc

lexer.o: lexer.cc
    g++ -c lexer.cc

parser.o: parser.cc
    g++ -c parser.cc

interpreter.o: interpreter.cc
    g++ -c interpreter.cc

clean:
    rm -rf *o hello

使用变量和评论 我们也可以在编写Makefile时使用变量

# Implementing a new sql lexer the variable CC will be
# the compiler to use.
CC=g++
# these flags will be passed to the compiler.
CFLAGS=-c -Wall
    all: interpreter

    interpreter: main.o lexer.o parser.o interpreter.o
        $(CC) main.o lexer.o parser.o interpreter.o -o interpreter

    main.o: main.cc
        $(CC) $(CFLAGS) main.cc

    lexer.o: lexer.cc
        $(CC) $(CFLAGS) lexer.cc

    parser.o: parser.cc
        $(CC) $(CFLAGS) parser.cc

    interpreter.o: interpreter.cc
       $(CC) $(CFLAGS) interpreter.cc

    clean:
        rm -rf *o hello