工具自动生成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.pswp.cn/web/91717.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/91717.shtml

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

相关文章

Java项目:基于SSM框架实现的校园活动资讯网管理系统【ssm+B/S架构+源码+数据库+毕业论文+远程部署】

摘 要 使用旧方法对校园活动资讯进行系统化管理已经不再让人们信赖了,把现在的网络信息技术运用在校园活动资讯的管理上面可以解决许多信息管理上面的难题,比如处理数据时间很长,数据存在错误不能及时纠正等问题。 这次开发的校园活动资讯网…

关于echarts的性能优化考虑

作为资深前端工程师,在处理 ECharts 性能问题时,核心思路是减少渲染压力、优化数据处理、避免不必要的计算,尤其在大数据量(万级以上)、高频交互或多图表场景下,性能优化尤为关键。以下是实战中验证过的有效…

汽车EDI:Vitesco EDI 项目案例

Vitesco Technologies(纬湃科技)脱胎于大陆集团的动力总成部门,是一家于2021年上市的全球领先汽车技术供应商。公司专注于电动出行领域,提供电驱动系统、电池管理系统、功率电子及热管理等关键技术解决方案。同时,其业…

译|Netflix 技术博客:一个利用视觉-语言模型和主动学习高效构建视频分类器的框架

本篇介绍了Netflix的视频标注器(VA),一个利用视觉-语言模型和主动学习的交互式框架。其技术亮点在于通过人机协作系统,结合零样本能力和主动学习,引导领域专家高效标注视频数据,显著提升了模型样本效率和平…

前端应用权限设计面面观

目录 1. 权限设计:前端为啥要操这份心? 2. 权限模型的“内功心法”:RBAC 和 ABAC RBAC:简单粗暴的角色分配 ABAC:灵活但烧脑的属性控制 3. 权限数据的“物流体系”:从后端到前端的旅程 权限数据从哪儿来? 权限数据咋存? 权限数据咋用? 4. 路由守卫:权限的“第…

Javaweb————Apache Tomcat服务器介绍及Windows,Linux,MAC三种系统搭建Apache Tomcat

🏍️🏍️🏍️第一部分:什么是服务器? 服务器是远程的一个电脑,里面安装服务器程序监听对应的端口对外提供服务,可以根据用户的请求去获取对应的数据并返回给调用方。 🏍️🏍️&#…

winsock socket通讯为什么UDP服务器无法获取客户端IP?

针对VB6 Winsock开发中UDP服务器无法获取客户端IP的问题,以下是系统性排查方案: 一、基础协议特性确认UDP无连接特性 Winsock的UDP协议本身是无连接的,需通过GetPeerName方法主动获取对端IP,而非自动存储。数据接收处理 必须在Dat…

大模型时代,Transformer 架构中的核心注意力机制算法详解与优化实践

大模型时代,Transformer 架构中的核心注意力机制算法详解与优化实践Transformer 注意力机制深度解析与工业级优化实践一、注意力机制核心原理1.1 基础注意力公式1.2 多头注意力(Multi-Head)1.3 注意力机制可视化二、工业级优化技术2.1 计算效…

自学嵌入式 day40 51单片机

一、嵌入式:以应用为中心,计算机为基础,软硬件可剪裁的专用计算机系统二、MCU:Micro Controcler Unit 微控制单元->单片机1、特点:集成化高,集成到一块芯片外设(GPIO、UART、ADC)…

Minimizing Coins(Dynamic Programming)

题目描述Consider a money system consisting of n coins. Each coin has a positive integer value. Your task is to produce a sum of money x using the available coins in such a way that the number of coins is minimal. For example, if the coins are {1,5,7} and t…

Kafka——关于Kafka动态配置

引言在Kafka的运维实践中,参数配置的调整曾是一件令工程师头疼的事情。传统模式下,Broker的所有参数都需要在server.properties中静态定义,任何修改都必须重启Broker才能生效。对于承载着核心业务的生产集群而言,频繁重启不仅意味…

MSQL-聚簇索引与非聚簇索引的比较

聚簇索引详解InnoDB 的聚簇索引特性表数据本身就是聚簇索引:数据行实际存储在聚簇索引的叶子节点中"表就是索引,索引就是表"的结构每个InnoDB表有且只有一个聚簇索引聚簇索引的叶子节点存储的是:真实数据主键作为聚簇索引&#xff…

语音识别数据集

目录 Voice Activity Detection 自己采集: 1. ASR Resources(语音识别资源) 2. LM Resources(语言模型资源) 这是一个数据表: 噪声数据集: Voice Activity Detection 自己采集&#xff1a…

Linux线程同步与互斥(上)

目录 前言 1.互斥 1.先来见一种现象(数据不一致问题) 2.如何解决上述问题 3.理解为什么数据会不一致&&认识加锁的接口 4.理解锁 5.锁的封装 前言 在前面对线程的概念和控制的学习过程中,我们知道了线程是共享地址空间的&#…

Codeforces Global Round 27

ABC 略D将每个数拆成x*2的整数次幂&#xff0c;一个直接的想法是尽量把2的整数次幂给大的数。那么所有乘上2的整数次幂的数构成的序列单调递减&#xff0c;反证法&#xff0c;如果序列中存在i j 使得a[i]<a[j]&#xff0c;那么我们不如把给a[i]乘的2的幂给a[j]乘。#include …

深入 Go 底层原理(二):Channel 的实现剖析

1. 引言"Do not communicate by sharing memory; instead, share memory by communicating." (不要通过共享内存来通信&#xff0c;而应通过通信来共享内存。) 这是 Go 语言并发设计的核心哲学。而 channel 正是实现这一哲学的核心工具。Channel 为 Goroutine 之间的…

Golang 语言的编程技巧之类型

1、介绍Golang 语言是一门静态类型的编程语言&#xff0c;我们在编写代码时&#xff0c;为了提升代码的灵活性&#xff0c;有时会使用空接口类型&#xff0c;对于空接口类型的变量&#xff0c;一般会通过类型断言判断变量的类型&#xff0c;而且可能还会遇到遇到类型转换的场景…

计数组合学7.11(RSK算法)

7.11 RSK算法 在对称函数理论中&#xff0c;有一个非凡的组合对应关系&#xff0c;称为RSK算法。&#xff08;关于缩写RSK的含义以及其他名称&#xff0c;请参阅本章末尾的注释。&#xff09;这里我们仅介绍RSK算法的最基本性质&#xff0c;从而能够给出舒尔函数一些基本性质的…

国产嵌入式调试器之光? RT-Trace 初体验!

做过嵌入式开发的工程师肯定都知道有这么个玩意儿 —— J-Trace&#xff0c;与我们日常使用的普通调试器不同点在于&#xff0c;它在基本的下载/调试代码之上还具有非常强大的代码运行跟踪能力&#xff0c;从而实现代码覆盖率的分析、指令回溯、CPU 资源监控等一系列强大的功能…

SLAM中的非线性优化-2D图优化之零空间实战(十六)

终于有时间更新实战篇了&#xff0c;本节实战几乎包含了SLAM后端的所有技巧&#xff0c;其中包括&#xff1a;舒尔补/先验Factor/鲁棒核函数/FEJ/BA优化等滑动窗口法的相关技巧&#xff0c;其中构建2D轮式里程计预积分以及绝对位姿观测的10帧滑动窗口&#xff0c;并边缘化最老帧…