首先说明一下文件:
头文件:parseBase.h 对应的cpp文件: parserBase.cxx
头文件:parseMethod.h 对应的cpp文件:parseMethod.cxx
头文件:V8Script.h 对应的cpp文件: V8Script.cpp
程序入口: main.cc
然后是头文件引用关系
main.cc 引用了 parseBase.h parseMethod.h V8Script.h
parserBase.cxx 引用了 parseBase.h parseMethod.h
parseMethod.cxx 引用了 parseBase.h parseMethod.h
V8Script.cpp 引用了 V8Script.h
接下来是一个一个写完了的makefile文件,我们来慢慢解读它
html:main.o parseMethod.o \
parserBase.o V8Script.o
g++ -std=c++11 -pthread -Xlinker -L../../include -o html main.o parseMethod.o parserBase.o V8Script.o -lv8
main.o:main.cc parseBase.h parseMethod.h V8Script.h
gcc -c -std=c++11 main.cc
parseMethod.o: parseMethod.cxx parseBase.h parseMethod.h
gcc -c -std=c++11 parseMethod.cxx
parserBase.o: parserBase.cxx parseBase.h parseMethod.h
gcc -c -std=c++11 parserBase.cxx
V8Script.o:V8Script.cpp V8Script.h
gcc -I"/home/lichao/workspace/html/include" -c -std=c++11 -lv8 V8Script.cpp
clean:
rm html main.o parseMethod.o \
parserBase.o V8Script.o
1.makefile 核心格式
makefile的目的就是帮助我们自动编译。因此我们首先来看它的核心编译格式
目标:需要的文件目标:指的是我们需要生成的东西。可以时最终的可执行文件,也可以是编译的中间文件(.o)文件
编译语句//(这一行,需要使用 tab 进行缩进,否则会报错, 不可以使用空格)
例如上述代码中,第一行最开始的 html ,就是指的我最终要生成的文件名;
而下面的好几段代码的开头 main.o: parseMethod.o: 冒号前面的.o文件,就是说明我们的目标时编译的中间文件
需要的文件:指的是为了生成目标,我们需要那些文件。
1.对于最终的可执行文件 html, 它需要的是多个编译中间文件(.o)文件,因此它的需要条件为
main.o parseMethod.o \
parserBase.o V8Script.o
斜杠(\)是linux 下换行符的意思。但是在斜杠(\)的前面或者后面至少有一处需要添加空格。
因为在makefile中,斜杠(\)并不能起到空格的作用,如果没有添加空格,会出现将讲个文件名合并的情况!
2.对于编译中间文件,它需要的是一个CPP文件以及多个头文件。
例如main.o,它的需要条件为 main.cc parseBase.h parseMethod.h V8Script.h
编译语句:指的是为了生成目标,需要执行什么编译语句。
1.编译语句需要在换行后,使用tab锁定,不能使用空格替代。
2.对于C++ 程序,建议使用 g++ 编译。
我一开始写的是:gcc -std=c++11 -pthread -Xlinker -L../../include -o html main.o parseMethod.o parserBase.o V8Script.o -lv8
发现很多的C++标准对象无法识别
3.对于一些引入的库(so)文件,和引入的目录(include目录),都需要添加到编译语句中去
例如编译 V8Script 时,添加上 -I"/home/lichao/workspace/html/include" -lv8
编译 html 时添加上-lv8,并且这里的-lv8 需要添加在最后,我一开始添加在开头,编译会出现问题,无法识别V8命名空间的对象。
我猜想这里的 -lv8 应该值得是在原有 那些(.o)文件后,在添加已有库的(.o)文件,例如 V8.o 这样的,因此需要写在最后。
这里我会继续研究下去的
4. 使用了C++11 特性后,编译时需要加上 -std=c++11 条件。
都编写好之后,就可以在命令行下,切换到对应目录,使用 make 命令进行编写。
如果编写出错,可以使用 make clean 命令清除生成的中间量
然后就可以试着运行程序了