IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 【C++编译】Cmake 编译选项及C++ 编译过程 -> 正文阅读

[C++知识库]【C++编译】Cmake 编译选项及C++ 编译过程

作者:recommend-item-box type_download clearfix

【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++来编译
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-01-08 13:48:12  更:2022-01-08 13:49:50 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 11:25:20-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码