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