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

工具自动生成Makefile

cmake 基础

cmake主要是生成Makefile,以便工程管理,只需要编写CMakeLists.txt
在这里插入图片描述
安装camke

sudo apt install cmake 安装cmake
camke --version 查看cmake版本
sudo apt upgrade cmake 升级cmake

源码隔离
在工程文件下创建一个build文件,进入到build目录下进行*cmake …*就可以将产生的中间文件进行隔离开,并且源文件的结构没有影响,最后生成的可执行文件生成在bulid下(可以进行指定)

cmake基本语法

1. 多文件编译

语法:
>add_executable(可执行文件 源文件1 源文件2 … …)

假设某可执行文件 main 由多个源码文件编译而成:

add_executable(main main.c a.c b.c)

2. 指定头文件路径

语法:

include_directories(头文件所在路径) --其中文件所在的路径可以是相对路径,也可以是绝对路径

例如现在的目录结构为
在这里插入图片描述
在cmake中需要指明对应文件的相对路径或者就对路径
···c

3.设定变量常用的shell命令

语法

set(变量名称,变量值)

在这里插入图片描述
在上述例子中使用了预定义变量,来获取当前的Cmakefile.txt的值,这样写的代码可维护,可读性更强

4. 添加子工程目录和编译库文件

语法
在这里插入图片描述
在这里插入图片描述

如果有一个工程目录下有lib文件夹,其中有源码,需要将其翻译成动态库或者静态库
在这里插入图片描述
者其中有两个CMakeLists.txt,其中外层的CMakeLists.txt是负责整个工程,内层的CMakeLists,txt负责指导Makefile如何编译lib中的文件
此时,只需要在 lib/ 下增加一个 CMakeLists.txt 文件即可,其内容如下:(内层)

add_library(a SHARED a.c) #a:生成静态库的名称 参数 所需的源文件
add_library(b STATIC b.c) # 静态库是默认的,此处STATIC 可以不写
STATIC:静态编译
SHARED:动态编译

注意,上述关键字 SHARED 和 STATIC 必须是大写。然后在顶层 CMakeLists.txt 增加该子目录的包含语句

在外层的CMakeLists.txt里面需要调用底层的CMakeLists.txt文件 代码如下:
在这里插入图片描述
总结 创建库
(1)对库里的源文件进行编译行为进行知道
(2)顶层cmake调用底层cmake add_subdirectory
(3)指定库文件的路径link_libraries
(3)为需要生成的可执行文件添加库的链接target_link_libraries

5.链接第三方库文件

如果主程序所依赖的库文件在别处
在这里插入图片描述
注意:语句 link_directories() 要写在 add_executable() 之前

6.指定工具链

如果项目在特定的平台上,会有交叉编译器,则需要指定工具链

在这里插入图片描述

7.设置编译选项

在这里插入图片描述

set(CMAKE_C_FLAGS “-O2 -Wl,-rpath=./lib”) # 设定优化等级和运行库所在路径
其中*-WL是指定编译器链接动态库的路径-rpath*r就是run,就是程序在运行时所加载的动态库

8.设定cmake的最低版本

在这里插入图片描述

9.设定项目的名称

在这里插入图片描述
只可以出现在顶层的CMake中

http://www.dtcms.com/a/311575.html

相关文章:

  • 机器学习——K 折交叉验证(K-Fold Cross Validation),实战案例:寻找逻辑回归最佳惩罚因子C
  • 深入理解C++中的vector容器
  • VS2019安装HoloLens 没有设备选项
  • 大模型(五)MOSS-TTSD学习
  • 二叉树的层次遍历 II
  • 算法: 字符串part02: 151.翻转字符串里的单词 + 右旋字符串 + KMP算法28. 实现 strStr()
  • Redis数据库存储键值对的底层原理
  • 信创应用服务器TongWeb安装教程、前后端分离应用部署全流程
  • Web API安全防护全攻略:防刷、防爬与防泄漏实战方案
  • Dispersive Loss:为生成模型引入表示学习 | 如何分析kaiming新提出的dispersive loss,对扩散模型和aigc会带来什么影响?
  • 二、无摩擦刚体捉取——抗力旋量捉取
  • uniapp 数组的用法
  • 【c#窗体荔枝计算乘法,两数相乘】2022-10-6
  • Python Pandas.from_dummies函数解析与实战教程
  • 【语音技术】什么是动态实体
  • 【解决错误】IDEA启动SpringBoot项目 出现:Command line is too long
  • 5734 孤星
  • process_vm_readv/process_vm_writev 接口详解
  • 如何在 Ubuntu 24.04 或 22.04 LTS Linux 上安装 Guake 终端应用程序
  • Next.js 怎么使用 Chakra UI
  • LINUX82 shell脚本变量分类;系统变量;变量赋值;四则运算;shell
  • 落霞归雁·思维框架
  • 队列的使用【C++】
  • 【王阳明代数讲义】基本名词解释
  • InfluxDB 与 Node.js 框架:Express 集成方案(一)
  • 【RK3568 RTC 驱动开发详解】
  • 操作系统-lecture5(线程)
  • Terraria 服务端部署(Docker)
  • Trae + Notion MCP:将你的Notion数据库升级为智能对话机器人
  • 自动驾驶中的传感器技术14——Camera(5)