当前位置: 首页 > news >正文

CMake编译指令极简说明

为什么使用CMake

对于一段高级程序编写的代码,计算机是不能直接拿来运行的,我们需要对其进行预处理——>编译——>汇编——>链接四个步骤,它才能成为计算机可识别的可执行文件。

对于单个程序,我们直接使用gcc/g++编译就可以,一般来说gcc test.c -o test就可以生成可执行文件test

当然,我们可以添加一些选项,比如链接静态库、动态库啥的

gcc test.c -o test -L./myPath -lstaticLib
gcc test.c -o test -L./myPath -ldynamicLib
# -L :添加库文件搜索路径。例如,-L./myPath会让链接器在/my/path下查找库文件
# -l :链接库文件,链接器会在指定的路径下查找库文件。
# 编译器会根据目录中是否有对应的.a或.so文件进行选择,两者都存在时优选.so动态库

对于少数文件我们可以直接在终端输入上述命令进行编译,但是,一旦我们的文件比较多,又有很多的编译选项,这时在命令行逐个输入就很麻烦了,此时我们可以将这些命令按一定的语法写在一个文件里,这个文件就叫Makefile,此时我们只需要执行Makefile这一个文件就可以编译整个项目了。

但是,Makefile的语法相对来说比较复杂,越大的项目,使用Makefile来管理就越复杂

CMake的作用是自行生成Makefile,相比直接写MakefileCMake配置文件的编写更简洁和易于理解,更容易扩展,此外还能够跨平台支持(Makefile是特定于某个平台的),因此,CMake目前使用比较广泛。

下面分享CMake配置文件CMakeLists.txt中一些最常见的命令。


常见指令分类与汇总

类别命令含义参数说明
基础cmake_minimum_required (VERSION 2.8)CMake的最低版本要求
基础 project (learn_cmake)项目的工程名
辅助aux_source_directory(dir SRC_LIST)dir下的源文件添加到变量SRC_LIST源文件的目录 源文件集合变量
辅助set(SRC_LIST main.c testFunc.c)设置变量的值变量名称 变量的值
辅助${SRC_LIST}变量引用语法,取SRC_LIST变量代表的值
辅助message(STATUS "The SRC_LIST is: ${SRC_LIST}")输出信息到终端消息类型 要输出的字符串
辅助option(MYDEBUG "enable debug compilation" OFF)定义变量用于条件编译变量名 描述 变量值
辅助set(CACHE MY_GLOBAL_STRING "simple")使变量MY_GLOBAL_STRING在整个CMake项目可见将变量设置为CACHE缓存变量
可执行文件add_executable(main ${SRC_LIST}})生成可执行文件main可执行文件 源文件列表
头文件搜索include_directories(dir1 dir2)引入头文件的搜索路径头文件搜索路径
多级目录add_subdirectory(src)编译时添加子目录src中的CMakeLists.txt
库文件add_library(libNameShared SHARED ${SRC_LIST})生成库库名称 静态/动态 源文件
库文件find_library(MY_LIB_PATH myLib searchPath)查找myLib库文件变量名 查找的库 查找路径
库文件target_link_libraries(execute_file ${MY_LIB_PATH})指定可执行文件链接哪些库可执行文件 待链接的库
其它set_target_properties(libNameShared PROPERTIES OUTPUT_NAME "libName")设置最终生成的库的一些属性库名称 属性的开始 目标文件名称(键) 库新名称(值)
其它add_compile_options(-std=c++11)添加全局编译选项
补充
库函数find_package(OpenCV REQUIRED)查找OpenCV库,并能自动处理库的依赖项find_package适用于大多数第三方库和复杂的库配置;find_library适用于自定义库或简单的库配置

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Redis计数器:数字的秘密
  • vue项目关于ERR_OSSL_EVP_UNSUPPORTED的问题
  • SpringBoot集成kafka开发-消息消费的分区策略(消费者如何判断从哪个分区中消费消息的?)
  • 【C#】【EXCEL】Bumblebee/Components/Analysis/GH_Ex_Ana_CondAverage.cs
  • huggingface下载model
  • Linux-远程访问及控制
  • Java数据结构篇
  • arm-Pwn环境搭建+简单题目
  • hostnamectrl到底是什么命令?
  • 还在烦恼Cosplay论坛开发?探索PHP+Vue的完美解决方案!
  • JVM类加载机制—类加载器和双亲委派机制详解
  • Mybatis框架常见问题总结
  • 计算机毕业设计Spark+Tensorflow股票推荐系统 股票预测系统 股票可视化 股票数据分析 量化交易系统 股票爬虫 股票K线图 大数据毕业设计 AI
  • 基于YOLOv8的无人机高空红外(HIT-UAV)检测算法,新的混合型扩张型残差注意力(HDRAB)助力涨点(二)
  • 小琳AI课堂:AIGC
  • [译]前端离线指南(上)
  • Flannel解读
  • magento 货币换算
  • Shadow DOM 内部构造及如何构建独立组件
  • Storybook 5.0正式发布:有史以来变化最大的版本\n
  • vue 配置sass、scss全局变量
  • 判断客户端类型,Android,iOS,PC
  • 如何设计一个比特币钱包服务
  • 使用API自动生成工具优化前端工作流
  • 通信类
  • 小程序button引导用户授权
  • SAP CRM里Lead通过工作流自动创建Opportunity的原理讲解 ...
  • ​​​​​​​STM32通过SPI硬件读写W25Q64
  • ​中南建设2022年半年报“韧”字当头,经营性现金流持续为正​
  • # 学号 2017-2018-20172309 《程序设计与数据结构》实验三报告
  • #HarmonyOS:Web组件的使用
  • #pragma once
  • (03)光刻——半导体电路的绘制
  • (2020)Java后端开发----(面试题和笔试题)
  • (C语言)fread与fwrite详解
  • (附源码)spring boot车辆管理系统 毕业设计 031034
  • (附源码)计算机毕业设计ssm本地美食推荐平台
  • (十)【Jmeter】线程(Threads(Users))之jp@gc - Stepping Thread Group (deprecated)
  • (十)Flink Table API 和 SQL 基本概念
  • (图文详解)小程序AppID申请以及在Hbuilderx中运行
  • (自适应手机端)响应式服装服饰外贸企业网站模板
  • .CSS-hover 的解释
  • .Net Core webapi RestFul 统一接口数据返回格式
  • .NET Core跨平台微服务学习资源
  • .NET Framework Client Profile - a Subset of the .NET Framework Redistribution
  • .net 按比例显示图片的缩略图
  • .NET 中让 Task 支持带超时的异步等待
  • .NET/C# 推荐一个我设计的缓存类型(适合缓存反射等耗性能的操作,附用法)
  • .net遍历html中全部的中文,ASP.NET中遍历页面的所有button控件
  • .net开发时的诡异问题,button的onclick事件无效
  • /etc/fstab 只读无法修改的解决办法
  • /var/spool/postfix/maildrop 下有大量文件
  • @RequestBody详解:用于获取请求体中的Json格式参数
  • [20181219]script使用小技巧.txt
  • [240727] Qt Creator 14 发布 | AMD 推迟 Ryzen 9000芯片发布