【C++编译】Cmake 编译选项及C++ 编译过程
0、 前言
-
在编程中使用C++,从学习C语言开始都知道是写出程序后,编译过程是先把库包含等弄好生成.obj对象,在去链接其中的动态库。但具体没去细研究编译的整个过程,在此做记录。
-
另外在大型程序中经常使用makefile来设置编译,更为简单的是使用cmake,在cmake中也涉及到编译设置,由于使用频率较多,在此做记录。
1、C++ 文件及C++编译器
1.1 C++文件
- C++ 程序支持的文件有多种,单一般大家都使用.h 和.cpp的后缀,但也有大型库中经常使用其他类型的后缀
- C++ 文件类型有一下几种(在使用中都一样,只是看编译器的支持与否)
.cc .cxx .cpp .cp .C .c++
- C++ 的头文件类型
.h .hpp
- 其中有一些头文件经常不用后缀,这与C++标准化有关,也就是98年C++标准化后,标准化的头文件就不用带后缀了(也指的是标准头文件,自己写的不能算)。
1.2 C++ 编译器
- C++编译器编译器出现过很多版本,有免费的有收费的
- 网上可以查到intel的ICC,HP的HP ACC等
- 但是我们常见的编译器最要有一下几类
- GCC 免费 Linux常用
- MSVC VS 内置的
- llvm+Clang
2、C++程序编译过程
要是使用大型的IDE的话,IDE直接配置了编译过程,不需要自己配置,所以一般学习者就不在乎这个过程,但是在许多用到第三方库,或者自己写库的过程中,需要自己熟悉整个过程,需要自己配置。
C++ 编译基础
- 1【预处理】头文件包含、内联、宏等先替换的基础操作,删除注释
- 2【编译】进行语法解析,生成汇编代码
- 3【汇编】将上一步生成的汇编代码编译成机器指令,生成obj对象
- 4【链接】链接到需要的库
一般来说前三步只要语法没问题就不会出错,第4步是最关键的,也是编程过程中最慢的。在使用第三方库后,头文件包含在前三步都完成了,最重要的是调用需要的动态库或者静态库来真正执行。
通俗的说链接过程,首先找到动态库,然后把程序调用的程序对应关联起来,让程序运行的时候能找到。
通过上面分析就可以这样解释,假如在一个程序使用了opencv库,最开始编译和链接都成功了,也运行成功了,但是你回头把opencv的动态库.so文件删除就直接运行不了了(ubuntu)下。在VS下,通常会在C++ 链接哪里直接输入OpencvWorld.dll,也就是需要链接到这里。
gcc手动编译
- 在Ubuntu下编译命令主要如下
gcc –c –I /usr/dev/mysql/include test.c -L test.o –o test.out
-o 后接输出文件路劲
-I 后接头文件
-L 后接链接库文件
-E 仅执行编译预处理
-wall 显示警告信息
-c 仅执行编译操作,不进行连接操作
3、CMake 编译设置
- CMake 的编译参数有如下:
CMAKE_C_FLAGS =
CMAKE_C_FLAGS_DEBUG = -g
CMAKE_C_FLAGS_MINSIZEREL = -Os -DNDEBUG
CMAKE_C_FLAGS_RELEASE = -O3 -DNDEBUG
CMAKE_C_FLAGS_RELWITHDEBINFO = -O2 -g -DNDEBUG
CMAKE_CXX_FLAGS =
CMAKE_CXX_FLAGS_DEBUG = -g
CMAKE_CXX_FLAGS_MINSIZEREL = -Os -DNDEBUG
CMAKE_CXX_FLAGS_RELEASE = -O3 -DNDEBUG
CMAKE_CXX_FLAGS_RELWITHDEBINFO = -O2 -g -DNDEBUG
- 1.【CMAKE_C_FLAGS】编译类型有四种: DEBUG RELEASE MINSIZEREL RELWITHDEBINFO
-
- 后面4个都是对应编译类型下的参数设置
- 3.【CMAKE_CXX_FLAGS】编译器设置(公共选项)
-
- 后面几个对应不同模式下的参数设置
一般情况用Debug和Release两种模式,两个例子如下
set(CMAKE_C_FLAGS "Debug")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -std=c++11 -Wl,-rpath=../lib")
set(CMAKE_C_FLAGS "Release")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_DEBUG} -std=c++11 -g")
在CMake中一些编译参数设置可以通过add_compile_options()来设置如:
add_compile_options(-std=c++14) # 设置14版本的C++来编译