【C++编译】Cmake 编译选项及C++ 编译过程

【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
    1. 后面4个都是对应编译类型下的参数设置
  • 3.【CMAKE_CXX_FLAGS】编译器设置(公共选项)
    1. 后面几个对应不同模式下的参数设置

一般情况用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++来编译
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值