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 # 删除可执行文件