GCC编译器

g++ C++

gcc C

编译过程

预处理:
g++ -E test.cpp -o test.i

编译:

g++ -S test.i -o test.s

汇编

g++ -c test.s -o test.o

链接: -o 为将来地可执行文件用指定的文件名

g++ test.o -o test

g++重要编译参数

  • -g :产生带调试信息的可执行文件
  • -O 优化源代码 -O0表示不做优化,-O1为默认优化,-O2 除了完成-O1的优化之外,还进行一些额外的调整工作,如指令调整等;-O3 包括循环展开和其他一些与处理特性相关的优化工作(time ./可执行文件 可以输出记录可执行文件的运行时间)
  • -l 指定库文件 -L 指定库文件路径 -l参数用来指定程序要链接的库,-l参数紧接着就是库名, 在/lib和/usr/lib和/usr/local/lib里的库直接用-l参数就能链接 eg: g++ -lglog test.cpp 如果库文件没有放在上面三个目录里,需要使用-L参数指定库文件目录即-L参数紧跟着库文件所在的目录名 eg: g++ -L/home/bing/myfolder -lmytest test.cpp
  • -I指定头文件搜索目录 如果头文件不在/usr/include目录下,则需要通过-I/muinclude 来进行参数的指定,-I可以采用./的相对路径
  • -Wall 打印警告信息
  • -w 关闭警告信息
  • -std=c++11 设置编译标准
  • -o 指定输出文件名
  • -D 定义宏 -DDEBUG 会在代码中及进行#ifdef的判断

生成库文件并编译

链接静态库生成可执行文件

g++ swap.cpp -c -I../include  // 汇编生成swap.o文件,-I指定该swap.cpp中引用头文件的位置
ar rs libSwap.a Swap.o  //生成静态库libSwap.a ,
// 其中静态库文件必须有lib前缀,lib后面的Swap为符号名,链接的时候使用符号名
g++ main.cpp -Iinclude -Lscr -lSwap -o staticmain  // 链接生成可执行文件
// 其中-I指定头文件的位置,-L只当静态库的位置,-l静态链接符号名
./staticmain // 运行可执行文件

链接动态库生成可执行文件

g++ swap.cpp -I../include -fPIC -shared -o  //生成动态库
g++ main.cpp -Iinclude -Lsrc -lswap -o sharemain  //链接生成可执行文件
LD_LIBRARY_PATH=src ./sharemain // 运行可执行文件,需指定动态库路径src

GDB调试器

VSCode

windows CRLF \r\n

Linux LF \n

高频使用快捷键

cmake 配置opencv vc16_开发语言

ctrl + shift + I 格式化代码

F2 变量统一重命名

CMake

CMake是一个跨平台的安装编译工具,可以用简单的语句描述所有平台的安装(编译过程)

cmake 配置opencv vc16_cmake 配置opencv vc16_02

基本语法格式 :指令(参数1 参数2…)

  • 参数使用括弧括起
  • 参数之间使用空格或分号分开

指令是大小写无关的,参数和变量是大小写相关的

变量使用${}方式取值,但是在IF控制语句中是直接使用变量名

重要指令

  • cmake_minimum_required :指定CMake的最小版本要求
  • cmake_minimum_required(VERSION 2.8.3)
  • project 定义工程名称,并可指定工程支持的语言 hui’kui
  • project(HELLOWORLD) 指定工程为为HELLOWORLD
  • set 显式的定义变量
  • set(SRC sayhello.cpp hello.cpp) 定义SRC变量,值为sayhello.cpp hello.cpp
  • include_directories 向工程添加多个特定的头文件搜索路径 即-I
  • include_directories(/usr/include/mufolder ./include) 将该两个目录添加到头文件搜索路径
  • link_directories 向工程添加多个特定的库文件搜索路径 即-L
  • link_directories(/usr/lib/mufolder ./lib) 将该两个目录添加到库文件搜索路径
  • add_library 生成库文件
  • add_library(hello SHARED|STATIC|MODULE ${SRC} ) 通过变量SRC生成/.a共享库
  • add_compile_options 添加编译参数
  • add_compile_options(-wall -std=c++11 -o2)
  • add_executable 生成可执行文件
  • add_executable(main main.cpp)
  • target_link_libraries 为target添加需要链接的共享库 即 -l参数
  • target_link_libraries(main hello test)

CMake常用变量

CMAKE_C_FLAGS gcc编译选项

CMAKE_CXX_FLAGS g++编译选项

set(CMAKE_CXX_FLAGS “${CMAKE_CXX_FLAGS -std=c++11”}) 在编译选项后追加-std=c++11

CMAKE_BUILD_TYPE 编译类型

set(CMAKE_BUILD_TYPE Debug) 设定编译类型为debug,调试时需要选择debug

set(CMAKE_BUILD_TYPE Release) 设定编译类型为release,发布时需要选择release

编译流程

  • 手动编写CmakeLists.txt
  • 执行命令cmake PATH 生成 Makefile (PATH式顶层CMakeLists.txt所在的目录)
  • 执行命令make进行编译

两种构建方式

  • 内部构建 (会在同级目录下产生一大堆中间文件,)
  • 外部构建(将编译输出文件与源文件放到不同目录中)