cmake 编译教程

参考链接:cmake使用详细教程(日常使用这一篇就足够了)_cmake教程-CSDN博客

 一、只有一个源文件的程序编译

首先在当前目录下创建两个文件
hello.cpp
CMakeLists.txt (注意CMakeLists大小写,不要写错了)
cmake_minimum_required (VERSION 2.8)project (learn_cmake)add_executable(hello hello.cpp)
  • 第一行意思是cmake最低版本要求2.8,
  • 第二行是本项目的工程名
  • 第三行:第一个变量:要生成的可执行文件名为hello,后面的参数是需要的依赖。
接着在当前目录下执行 cmake . 接着会发现目录下多生成了一些文件,例如Makefile,然后使用GNU make命令来编译程序,会生成可执行程序。

二、同一目录下多个源文件

此时在当前目录新增两个依赖,并mian函数的执行需要依赖这两个文件

add.cpp

add.h

只需要在CMakeLists.txt中添加所依赖的.cpp文件,编译步骤和上面相同。

cmake_minimum_required (VERSION 2.8)project (learn_cmake)add_executable(hello hello.cpp myadd.cpp)

三、同一目录下很多源文件


如果同一目录下有无穷多源文件,那么一个一个添加就很慢了。此时可以使用cmake中的函数存储这些源文件

aux_source_directory(dir var)

他的作用是把dir目录中的所有源文件都储存在var变量中

然后需要用到源文件的地方用 变量var来取代

此时 CMakeLists.txt 可以这样优化

cmake_minimum_required(VERSION 2.8)project(learn_cmake)aux_source_directory(. SRC_LIST)add_executable(hello ${SRC_LIST})

四、头文件在别的文件夹

对于集中的头文件,CMake提供了一个很方便的函数

include_directories ( dir )

他的作用是 自动去dir目录下寻找头文件,相当于 gcc中的 gcc -I dir

此时 CMakeLists.txt 可以这样优化

cmake_minimum_required(VERSION 2.8)project(learn_cmake)aux_source_directory(. SRC_LIST)include_directories(./inc_dir)add_executable(hello ${SRC_LIST})

 五、头文件源文件分离,并含有多个文件夹

假如说当前的工程目录是这样的,头文件和源文件分离,并含有多个文件夹

此时 CMakeLists.txt 可以这样优化

cmake_minimum_required(VERSION 2.8)project(learn_cmake)aux_source_directory(src_dir1 SRC_LIST1)
aux_source_directory(src_dir2 SRC_LIST2)
aux_source_directory(main_dir MAIN_DIR)include_directories(./inc_dir1 ./inc_dir2)add_executable(hello ${SRC_LIST1} ${SRC_LIST2} ${MAIN_DIR})

六、生成动态库和静态库

假如说当前的项目目录是这样的

  • inc目录下存放头文件
  • src目录下存放源文件
  • lib目录下存放生成的库
  • build目录下存放构建项目相关的文件,如CMakeLists.txt。而稍后我们也在这个目录下执行cmake和make

 

 此时 CMakeLists.txt 可以这样优化

cmake_minimum_required(VERSION 2.8)project(learn_lib)#整合源文件
aux_source_directory(${PROJECT_BINARY_DIR}/../src SRC_LIST)#引入头文件路径
include_directories(${PROJECT_BINARY_DIR}/../inc)#生成静态库或者动态库 参数1:生成的库的名称 参数2:静态或动态 参数3:生成库所需要的源文件
add_library(func_shared SHARED ${SRC_LIST})
add_library(func_static STATIC ${SRC_LIST})#设置最终生成的库的名称
set_target_properties(func_shared PROPERTIES OUTPUT_NAME "myfunc")
set_target_properties(func_static PROPERTIES OUTPUT_NAME "myfunc")#设置生成的库的路径
set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/../lib)

开始编译:

  1. 在build目录下执行 cmake .
  2. 在build目录下执行 make
  3. 查看lib目录下是否生成库文件,

出现库文件就算编译成功

七、链接库文件

库文件目录结构如下:

  • lib目录下存放静态库和动态库
  • main_src目录下存放main函数相关的源文件
  • bin目录存放项目生成的可执行文件

 此时 CMakeLists.txt 可以这样写

cmake_minimum_required(VERSION 2.8)project(learn_lib)#整合源文件
aux_source_directory(${PROJECT_BINARY_DIR}/../main_src MAIN_SRC)#引入头文件路径
include_directories(${PROJECT_BINARY_DIR}/../inc)#生成静态库或者动态库 参数1:生成的库的名称 参数2:静态或动态 参数3:生成库所需要的源文件
add_library(func_shared SHARED ${SRC_LIST})
add_library(func_static STATIC ${SRC_LIST})#设置最终生成的库的名称
set_target_properties(func_shared PROPERTIES OUTPUT_NAME "myfunc")
set_target_properties(func_static PROPERTIES OUTPUT_NAME "myfunc")#设置生成的库的路径
set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/../lib)#查找库文件 第一个参数:存储查找到的库文件 第二个参数:要查找的库文件 第三个参数:要查找的目录
find_library(FUNC_LIB myfunc ${PROJECT_BINARY_DIR}/../lib)#设置可执行文件生成到哪里
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/../bin)add_executable(hello ${MAIN_SRC})target_link_libraries(hello ${FUNC_LIB})

八、如何选择动态库和静态库

选择生成动态库(Dynamic Link Library,DLL 在 Windows 上,Shared Object,.so 在 Unix/Linux 上,或 Dynamic Library,.dylib 在 macOS 上)还是静态库(Library Archive,.a 或 .lib)主要取决于以下几个因素:

动态库的优点:

  1. 资源占用: 动态库在多个程序间共享相同的代码,可以节省系统内存和磁盘空间,因为不需要为每个使用该库的应用程序复制整个库。
  2. 更新方便: 更新动态库时,所有依赖它的应用程序都会自动使用新版本,无需重新编译或分发应用程序。
  3. 模块化: 动态库可以更容易地实现模块化编程,允许在运行时加载或卸载库,增强程序的灵活性和扩展性。
  4. 性能: 尽管启动时可能需要一些额外的时间来解析动态库中的符号,但在频繁调用的情况下,动态链接可能会更快,因为它避免了静态链接中的冗余代码。

静态库的优点:

  1. 部署简单: 使用静态库的程序是自包含的,不需要在目标机器上存在额外的库文件。
  2. 可靠性: 不会受到“依赖地狱”问题的影响,即不会因为缺少动态库或者动态库版本不匹配而导致程序崩溃。
  3. 安全性: 避免了由于动态库被恶意替换而导致的安全风险。
  4. 兼容性: 特别是在嵌入式系统或资源受限的环境中,静态链接可以确保软件的完整性和最小化依赖。

选择策略:

  • 如果库的使用者需要减少最终可执行文件的分发复杂度,或者目标平台资源有限,静态库可能是更好的选择。
  • 如果库需要在多个应用之间共享,或者希望简化库的更新流程,动态库更为合适。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/397962.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

推荐一个优秀的 .NET MAUI 组件库

目录 前言 组件介绍 组件展示 布局 按钮 复选框 进度条 导航栏 组件地址 最后 前言 .NET MAUI 的发布,项目中可以使用这个新的跨平台 UI 框架来轻松搭建的移动和桌面应用。 为了帮助大家更快地构建美观且功能丰富的应用,本文将推荐一款优秀…

AcCode核心思路

文章目录 在线OJ项目核心思路1. 项目介绍2.预备知识理解多进程编程为啥采用多进程而不使用多线程?标准输入&标准输出&标准错误 3.项目实现题目API实现相关实体类定义新增/修改题目获取题目列表 编译运行编译运行流程 4.统一功能处理 在线OJ项目核心思路 1. 项目介绍 …

有序转化数组(LeetCode)

题目 给你一个已经 排好序 的整数数组 和整数 、 、 。对于数组中的每一个元素 ,计算函数值 ,请 按升序返回数组 。 解题 在时间复杂度为解决问题 def sortTransformedArray(nums, a, b, c):def f(x):return a * x * x b * x cn len(nums)result…

4个从阿里毕业的P7打工人,当起了包子铺的老板

吉祥知识星球http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247483727&idx1&sndb05d8c1115a4539716eddd9fde4e5c9&chksmc0e47813f793f105017fb8551c9b996dc7782987e19efb166ab665f44ca6d900210e6c4c0281&scene21#wechat_redirect 《网安面试指南》h…

学生公寓电费信息管理小程序的设计

管理员账户功能包括:系统首页,个人中心,公寓管理员管理,学生管理,楼层信息管理,用电情况管理,缴费清单管理,系统管理 微信端账号功能包括:系统首页,用电情况…

【数据结构】六、图:4.图的遍历(深度优先算法DFS、广度优先算法BFS)

三、基本操作 文章目录 三、基本操作1.图的遍历1.1 深度优先遍历DFS1.1.1 DFS算法1.1.2 DFS算法的性能分析1.1.3 深度优先的生成树和生成森林 1.2 广度优先遍历BFS1.2.1 BFS算法1.2.2 BFS算法性能分析1.2.3 广度优先的生成树和生成森林 1.3 图的遍历与图的连通性 1.图的遍历 图…

Nginx系列-Nginx Location匹配规则

文章目录 Nginx系列-Nginx Location匹配规则1. 语法基础2. 匹配规则2.1 精确匹配()2.2. 最长前缀匹配(^~)2.3. 正则表达式匹配(~和~*)2.4. 普通前缀匹配(无修饰符)2.5. 默认匹配&…

贷齐乐hpp+php特性注入

文章目录 运行过程waf第一层waf拦截第二层waf拦截 数据库查询语句注入思路注入 运行过程 foreach ($_REQUEST as $key > $value) {$_REQUEST[$key] dowith_sql($value);}$request_uri explode("?", $_SERVER[REQUEST_URI]);if (isset($request_uri[1])) {$rewr…

OpenGL3.3_C++_Windows(34)

demo 1 Fresnel-Schlick PBR直接光源 顾名思义:直接光源指有光源直接照射到点p 的辐射强度,由于一个光源只会有一个光线wi影响点p,所以和之前的计算没什么差异对于影响p的光源,并不需要积分计算半球形辐照度,遍历每个…

redis面试(十)锁释放

自动释放 首先锁的释放分为两种,一种是自动释放,加入说加锁的线程宕机了不在了,我们之前说过这个。 那这个线程中的对redis这个锁不断刷新过期时间的看门狗逻辑就没有了,所以这个锁最多等待30s的时间就会自动过期删除&#xff0c…

为什么选择在Facebook投放广告?

2024年了你还没对 Facebook 广告产生兴趣?那你可就亏大了! 今天这篇文章,我们会分享它对你扩大业务的好处。要知道,Facebook 广告凭借它庞大的用户群和先进的定位选项,已经是企业主们有效接触目标受众的必备神器。接下…

【uniapp】uniapp+vue2微信小程序实现分享功能

uniappvue2做的微信小程序实现分享功能 问题描述 uniappvue2做的微信小程序,发布以后点击右上角三个点,分享小程序的时候,转发和分享按钮都是灰色 解决方案 转发、分享、复制链接这几个功能需要自己来手动写方法,考虑到每个页…

Unity入门3——脚本入门

本文使用的代码编辑器为VSCode 安装接口有: 通过将变量设置为public,可以直接在unity的Inspector面板中看到相关变量。此时可直接将需要的素材拖拽到变量处。 [SerializeField]可序列化:定义后可以使非公共的属性也显示在unity面板 [Range]…

搜维尔科技:【研究】大屏幕沉浸式系统的优势,视觉冲击强、‌分辨率高、‌画面层次感强以及沉浸式交互性体验好等!

大屏幕沉浸式系统的优势主要体现在视觉冲击强、‌分辨率高、‌画面层次感强以及沉浸式交互性体验好。‌ 视觉冲击强:‌大屏幕沉浸式系统通过使用多台投影机投射画面,‌结合高质量影片,‌营造出场景环境,‌通过视觉艺术直击体验者…

js 深入理解原型(prototype)及如何创建对象

目录 1. 概述2. 工厂模式3. 构造函数模式3.1 创建的格式3.2 JS内部执行步骤3.3 constructor 构造器3.4 构造函数也是函数3.5 构造函数的问题 4. 原型模式 prototype4.1 理解原型本质4.2 原型层级(访问一个属性,查询的次序)4.2.1 查询次序:实例…

SeaTunnel 实战: Apache SeaTunnel 安装与部署

文章目录 一、准备工作1.1 环境1.2 下载 二、SeaTunnel安装2.1 解压安装包2.2.配置环境变量2.3.配置立刻生效2.4 下载SeaTunnel相关jar包2.5 测试验证2.6 启动服务 三、SeaTunnel Web 1.0.1安装3.1 将下载的压缩包解压缩到指定目录下3.2 设置 SeaTunnel Web 环境变量3.3 初始化…

pythonUI自动化008::allure测试报告(安装及应用)

allure报告预览 1 下载jdk,配置jdk Path变量: https://www.cnblogs.com/FBGG/p/15103119.html(这里不作阐述,请看该偏文章配置即可) 2 下载allure驱动,配置allure Path变量: 下载allure驱动&a…

【免费】最新区块链钱包和私钥的助记词碰撞器,bybit使用python开发

使用要求 1、用的是google里面的扩展打包成crx文件,所以在使用之前你需要确保自己电脑上有google浏览器,而且google浏览器版本需要在124之上。(要注意一下,就是电脑只能有一个Chrome浏览器) 2、在win10上用vscode开发…

锂电池剩余寿命预测 | Matlab基于Transformer-GRU的锂电池剩余寿命预测

目录 预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Matlab基于Transformer-GRU的锂电池剩余寿命预测,Transformer结合门控循环单元。 Matlab基于Transformer-GRU的锂电池剩余寿命预测(单变量) 运行环境Matlab2023b及以上。 首先从…

C++初阶:模版进阶【非类型模版参数】【模版的特化】【模版分离编译】

目录 一.非类型模版参数 二.模版的特化 2.1模版特化的概念 2.2函数模版的特化 2.3类模版特化 2.3.1全特化 2.3.2偏特化 2.3.3使用类模版特化 三.模版分离编译 一.非类型模版参数 模板参数分类类型形参与非类型形参。 类型形参:出现在模板参数列表中&…