make编译
编译器介绍
编译器介绍:
- 
cc: Unix系统的C Compiler,老式C编译器;linux下cc即gcc
 - 
gcc:只编译不链接
 - 
gcc -lstdc++:编译也链接
 - 
g++: 编译调用gcc,链接用g++
 
综上:
- 单文件用g++,gcc -lstdc++,gcc,cc
 - 多文件用g++,gcc -lstdc++
 
编译流程
|----  -c   编译  ----|--------------  -o  链接  --------------|
.cpp   ----- 自动命名.o .so --  手动命名.o .so -- 可执行文件(如.exe)
.h     --/
注:
- 
上文
.cpp皆也可是.c - 
自动命名规则:
xxx.cpp生成xxx.o 
make 命令行
凡例
- 下文
g++可换为gcc -lstdc++ - 格式可以是,二者等效(下只写前者):
g++ 父文件 -参数 生成文件//理解成用g++从父文件经过-o/-c生成生成文件g++ -参数 生成文件 父文件
 
法一. 直接生成可执行文件,不残留中间文件
g++ 所有.cpp ([-c执行参数]) -o 可执行文件 ([-c与-o共同的执行参数])
- [-c执行参数] 如:
-std=c++11 - [-c与-o共同的执行参数] 如:
-std=c++11(建议:如果用c11,则设置-c与-o共同的执行参数-std=c11) 
法二. 分步,残留中间文件
- 
编译:从源代码生成之间文件
自动命名
g++ 单个或多个.cpp -c手动命名
g++ 一个.cpp -c -o 命名 - 
链接:从中间文件得到可执行文件
g++ 所有.o -o 可执行文件名 
makefile
凡例
- 
在工程文件夹根目录创建
makefile文件,其内容写法见下文 - 
在
makefile所在目录执行make,即编译 - 
文件名必需命名为
makefile,不可命名为Makefile - 
makefile文件内缩进必需用tab,不可用若干个空格,不然无法进行编译 
法一. 直接生成可执行文件,不残留中间文件
makefile内容
CPP=[所有.cpp文件]
H=[所有.h文件]
EXE=[可执行文件名]
$(EXE):$(CPP) $(H)
    g++ -o $(EXE) $(CPP) [其他参数]
其他参数包括:
| 头文件 | 编译参数 | 
|---|---|
<pthread.h> | 
-lpthread | 
调opencv2的包,如<opencv2/core/core.hpp> <opencv2/highgui/highgui.hpp> <opencv2/imgproc/imgproc.hpp> | 
pkg-config --cflags --libs opencv | 
任何c++11的特性,如<thread.h> | 
-std=c++11 | 
| 任何c11的特性 | -std=c11 | 
在makefile所在目录执行make,即直接生成可执行文件,不残留中间文件
法二. 分步,残留中间文件
O=[所有.o文件]
EXE=[可执行文件名]
main:$(OBJ)
    g++ -o $(EXE) $(O)
main.o:[所有它include的.h文件]
Loop.o:[所有它include的.h文件]
toint.o:[所有它include的.h文件]
.PHONY:clean
clean:
    -rm $(O)
.PHONY:cleanexe
cleanexe:
    -rm $(EXE)
.PHONY: 意思表示clean是一个“伪目标”-rm: -表示若某些文件问题,仍继续执行后面的指令
在命令行中,进入到makefile所在目录,输入
make			# 编译
make clean		# 删除中间文件
make cleanexe	# 删除可执行文件