cmake学习
一、cmake整体思路
根据cmake编写命令(CMakeLists.txt),生成对应的makefile文件(Makefile)。
通过执行make命令,将Makefile转成对应的gcc/g++命令,从而生成可执行文件。
整个过程即为编译的过程。
cmake使用方法:
mkdir build
cd build
cmake path #path 指CMakeLists.txt所在位置
make
./可执行文件 #运行可执行文件
CMakeLists.txt通用设置:
(1)cmake版本号
(2)工程名称
# $ cmake --version
cmake_minimum_required(VERSION 3.5)
# Set the project name
project (hello_cmake)
1. 单个cpp文件cmake思路
cpp文件,直接生成可执行文件。
add_executable()函数的第一个参数是要生成的可执行文件的名称,第二个参数是要编译的源文件的列表。
add_executable(hello_cmake main.cpp) #可执行文件名, 单个cpp文件名
2. 多个cpp文件 + 头文件 cmake思路
过程:
cpp文件生成可执行文件
可执行文件链接头文件
#创建一个带有所有cpp文件链接的源变量以编译
set(SOURCES
src/Hello.cpp
src/main.cpp
)
#在SOURCES变量中设置特定文件名的另一种方法是使用GLOB命令使用通配符模式匹配来查找文件。
file(GLOB SOURCES "src/*.cpp")
#两种方法通用,选择其中一种使用即可。
#生成可执行文件
add_executable(hello_headers ${SOURCES})
当有其他包含文件夹时(头文件文件夹),可以使用target_include_directories()函数使编译器意识到它们
在最后的g++编译过程,会自动链接到头文件路径
target_include_directories(hello_headers
PRIVATE
${PROJECT_SOURCE_DIR}/include #PROJECT_SOURCE_DIR 当前cmake项目的源目录。
)
3. 创建并链接一个静态库 cmake思路
过程:
根据源文件创建静态库,静态库链接头文件
生成可执行文件并链接静态库,静态库再链接头文件
# add_library()函数 从某些源文件创建一个库
add_library(hello_library STATIC #静态库的名称为hello_library
src/Hello.cpp
)
#生成 使用库的 可执行文件
add_executable(hello_binary
src/main.cpp
)
#使用target_link_libraries()函数告知编译器,找到库
target_link_libraries( hello_binary
PRIVATE
hello_library
)
#库链接头文件
target_include_directories(hello_library #两次链接头文件1. 生成共享库 2.生成可执行文件
PUBLIC
${PROJECT_SOURCE_DIR}/include
)
问题1:target_include_directories()函数 PUBLIC参数
https://zhuanlan.zhihu.com/p/82244559
问题2: 静态库与头文件的关系
将源文件编译成为静态库之后,
静态库文件相当于将函数接口留在了头文件head.h中,即函数声明。
用户看了头文件就知道如何使用静态库文件了,即如何使用函数。
因此最后只需要将main.c、head.h和库文件给用户即可。
用户就可以根据头文件中的接口情况,来知道库文件的功能 (具体怎么实现的他也不知道),
从而用户就可以使用库文件来完成自己的工作了(即执行main.c)
头文件的使用
编译静态库时,使用到头文件
编译其他目标文件时链接到静态库时,会使用到头文件。
问题3:静态库与动态库的区别
头文件stdio.h,其对应的是printf函数的声明,其库文件是printf函数实现的库文件,该库文件有C提供,它们是标准头、库文件,因此不需要指明路径和名称,且该库函数为动态库函数,当程序在运行过程中需要该库函数时,才会根据头文件找到相应的库函数并加载进入内存空间。
而静态库文件在载入内存之前就已经链接在了一起成为程序代码的一部分。
后续根据理解待补充。。。
问题4:静态库的优缺点
优点:
1. 发布程序的时候不需要提供对应的库(动态库需要);
2. 加载库的速度快(库函数就在代码区)。
缺点:
1. 库被打包到代码中,增加了代码的体积
2. 库一旦发生了改变,需要对整个程序进行重新编译。
静态库介绍:
https://blog.csdn.net/u013132758/article/details/94355795
4. 创建并链接一个共享库 cmake思路
过程:(与静态库类似)
根据源文件创建共享库库,共享库链接头文件
生成可执行文件并链接共享库,共享库再链接头文件
add_library(hello_library SHARED #将STATIC换成SHARED
src/Hello.cpp
)
#可以给库取别名
add_library(hello::library ALIAS hello_library)
add_executable(hello_binary
src/main.cpp
)
target_link_libraries( hello_binary
PRIVATE
hello::library
#hello_library #两种方式都可以
)
target_include_directories(hello_library
PUBLIC
${PROJECT_SOURCE_DIR}/include
)
- 算法基础:优先队列
- 黑暗的内存管理
- 二分查找
- 译文 | Android 开发中利用异步来优化运行速度和性能
- 算法基础6:二叉树查找
- 通过UDP广播实现Android局域网Peer Discovering
- tensorflow读取数据-tfrecord格式
- 用Python使用C语言程序(Windows平台)
- 译文 | 在使用过采样或欠采样处理类别不均衡数据后,如何正确做交叉验证?
- 花式解释AutoEncoder与VAE
- 用CNN做句子分类:CNN Sentence Classification (with Theano code)
- MySQL与Python的交互
- 实时Android语音对讲系统架构
- ElasticSearch优化系列二:机器设置(内存)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 《啊哈算法》桶排序详解
- 你不得不知道的Git常用命令
- Java中静态代码块、代码块以及构造函数执行顺序详解
- 手写一个JDK1.7的简版HashMap
- MySQL存储过程创建与使用
- 一些有意思的JavaScript代码片段
- Flutter 完成全平台制霸:实现 Windows 应用支持
- python包:urllib——使用urllib下载无限制链接图片
- 初探 TensorFlow.js
- 如何使用 Apache Directory Studio 连接 JumpCloud
- 0812-5.16.2-如何获取CDSW上提交Spark作业的真实用户
- GLMM:广义线性混合模型(遗传参数评估)
- 特征锦囊:今天一起搞懂机器学习里的L1与L2正则化
- 【一天一大 lee】二叉搜索树的最近公共祖先 (难度:简单) - Day2020092
- Spring多数据源事务如何玩? | Spring系列46篇