C++ 学习笔记(三) 编写makefile

时间:2021-04-30 09:23:01

首先说明一下文件:

头文件: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的目的就是帮助我们自动编译。因此我们首先来看它的核心编译格式

目标:需要的文件
编译语句//(这一行,需要使用 tab 进行缩进,否则会报错, 不可以使用空格)
目标:指的是我们需要生成的东西。可以时最终的可执行文件,也可以是编译的中间文件(.o)文件

    例如上述代码中,第一行最开始的 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 命令清除生成的中间量

然后就可以试着运行程序了