CMake项目实战指令详细分析
CMake是一个跨平台的自动化构建系统,可以用简单的语句来描述所有平台的编译过程。CMake可以输出各种各样的编译文件,如Makefile、VisualStudio等。
CMake主要是编写CMakeLists.txt文件,然后用cmake命令将CMakeLists.txt文件转化为make所需要的makefile文件,最后用make命令编译源码生成可执行程序或共享库(so (shared object))。
你可以在CMakeLists.txt中指定源文件、头文件、库文件、链接库等信息,然后通过cmake命令生成相应的makefile文件。
文章目录
- 1. 单main.c文件输出"hello world"
- 2. 使"hello world"更像一个工程文件
1. 单main.c文件输出"hello world"
mian.c
#include <stdio.h>
int main(){printf("hello world!\n");return 0;
}
CMakeLists.txt
cmake_minimum_required(VERSION 3.15)
PROJECT(HELLO)
SET(CMAKE_C_COMPILER gcc)SET(SRC_LIST main.c)
MESSAGE(STATUS "This is BINARY dir" ${HELLO_BINARY_DIR})
MESSAGE(STATUS "This is SOURCE dir" ${HELLO_SOURCE_DIR})
ADD_EXECUTABLE(hello ${SRC_LIST})
-
cmake_minimum_required(VERSION X.X) : 指定cmake的最低版本。
-
project( project_name ) : 指定工程名称,这个指令隐式的指定了两个CMake变量,那就是<project_name>_BINARY_DIR,<project_name>_SOURCE_DIR。在这个例程中,我们命名project_name为HELLO,所以也指定了HELLO_BIARY_DIR和HELLO_SOURCE_DIR。所以当我们更改了工程名之后,<project_name>_BINARY_DIR和<project_name>_SOURCE_DIR也要跟着改变。但是!如果我们使用PROJECT_BINARY_DIR和PROJECT_BINARY_DIR,那么工程名随便改动,这两个变量名会随之改变。
MESSAGE(STATUS "This is BINARY dir" ${PROJECT_BINARY_DIR}) MESSAGE(STATUS "This is SOURCE dir" ${PROJECT_SOURCE_DIR}) -
set(CMAKE_C_COMPILER gcc) : 指定CMake使用gcc编译器来编译C代码
-
SET(SRC_LIST main.c) : SET 还可以显式的定义变量,语法是这样的:
SET(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]])现阶段,你只需要知道SET可以显式的定义变量即可。如果有多个源文件,还可以这样定义:SET(SRC_LIST main.c t1.c t2.c)
-
MESSAGE的语法是这样的:
MESSAGE([SEND_ERROR | STATUS | FATAL_ERROR] "message to display" ...)这个指令用于向终端输出用户定义的信息,包含了三种类型:
- SEND_ERROR,产生错误,生成过程被跳过。
CMake Error at CMakeLists.txt:6 (MESSAGE):
This is BINARY dir/home/zch/CmakePratice/t1/buildCMake Error at CMakeLists.txt:7 (MESSAGE):
This is SOURCE dir/home/zch/CmakePratice/t1- SATUS,输出前缀为–的信息。
– This is BINARY dir/home/zch/CmakePratice/t1/build
– This is SOURCE dir/home/zch/CmakePratice/t1- FATAL_ERROR,立即终止所有 cmake 过程.
CMake Error at CMakeLists.txt:6 (MESSAGE):
This is BINARY dir/home/zch/CmakePratice/t1/build– Configuring incomplete, errors occurred!
-
ADD_EXECUTABLE(hello ${SRC_LIST})
定义了这个工程会生成一个文件名为 hello 的可执行文件,相关的源文件是 SRC_LIST 中
定义的源文件列表, 本例中你也可以直接写成 ADD_EXECUTABLE(hello main.c)。
2. 使"hello world"更像一个工程文件
相关文章:
CMake项目实战指令详细分析
CMake是一个跨平台的自动化构建系统,可以用简单的语句来描述所有平台的编译过程。CMake可以输出各种各样的编译文件,如Makefile、VisualStudio等。 CMake主要是编写CMakeLists.txt文件,然后用cmake命令将CMakeLists.txt文件转化为make所需要的…...
【深度学习】——LSTM参数设置
批大小设置 LSTM的批大小可以根据训练数据集的大小和计算资源的限制来确定。一般而言,批大小越大,训练速度越快,但可能会导致过拟合和内存限制。批大小越小,训练速度越慢,但对于较大的数据集和内存限制较严格的情况下…...
计算机网络高频60问 背完差不多了!!
计算机网络高频60问 网络分层结构 计算机网络体系大致分为三种,OSI七层模型、TCP/IP四层模型和五层模型。一般面试的时候考察比较多的是五层模型。 五层模型:应用层、传输层、网络层、数据链路层、物理层。 应用层:为应用程序提供交互服务…...
路由策略小实验
实验要求: 1、R1环回使用重发布,R2和R3使用双向重发布 2、使用路由策略解决,选路不佳 第一步,基础配置 [R1]int l0 [R1-LoopBack0]ip add 1.1.1.1 24 [R1-LoopBack0]int g0/0/0 [R1-GigabitEthernet0/0/0]ip add 192.168.12.1 …...
C语言realloc背后的内存管理
malloc申请内存,但不初始化。 calloc申请内存,且初始化为0。 free释放内存。 realloc重新分配已经分配的内存空间,可以变小,也可以变大。 以前一直有一个疑问,realloc是不是经常失败? 其实,rea…...
GPT可以被放任的在问答区应用吗?
GPT可以被放任的在问答区应用吗?1、CSDN问答乱象2、GPT-4,大增长时代的序幕数字生命离我们到底还有多远?AI 家教/老师/教育 距离独立又有哪些需要完成的过程?3、老顾对CSDN问答的一些看法老顾对GPT使用者的一些建议1、CSDN问答乱象…...
限制网络接口的一些简介(一)
大家在上网的时候,我们设置了www,当有来自internet的www要求时,我们的主机就会予以响应。这是因为你的主机已经开启了www的监听端口。所以,当我们启用一个daemon时,就可能触发主机的端口进行监听的动作,此时…...
ChatGPT如何批量撰写最新的热点自媒体文章
如何用ChatGPT创作高质量的自媒体文章 自媒体已成为互联网上的一个重要组成部分,无论您是想在社交媒体、博客中发布内容,高质量的文章都是自媒体成功的重要组成部分。ChatGPT是一个智能文章生成器,能够帮助创作者快速、高效地生成高质量的自…...
GPT4和ChatGPT的区别,太让人震撼
文 | Serendipity知乎 前言 GPT4上午朋友圈已经刷屏啦,不过我还在忙,刚刚才登上 GPT-4 ,现在来体验一下~ 附 GPT-4 能力测试站(无需魔法,仅供国内研究测试): https://gpt4test.com 附 Cha…...
redis实战---分布式锁--单机篇
redis分布式锁故事背景什么是Redis分布式锁业务场景未加任何锁的代码单机情况下JVM级别加锁多服务部署总结提升故事背景 本篇文章是redis实战系列的第二篇文章。本章的主要内容是Redis分布式锁的相关知识。本篇文章将告诉你什么是分布式锁,结合一个业务场景&#x…...
Java正则表达式
Java 正则表达式 文章目录Java 正则表达式捕获组正则表达式语法Matcher 类的方法索引方法查找方法替换方法start 和 end 方法matches 和 lookingAt 方法replaceFirst 和 replaceAll 方法appendReplacement 和 appendTail 方法PatternSyntaxException 类的方法正则表达式是对字符…...
MySQL数据库之——高级[进阶]SQL语句(二)正则表达式和存储过程
文章目录一、正则表达式(REGEXP)1、正则表达式匹配符2、语法二、存储过程1、概述2、优点3、 创建、调用、查看和删除存储过程4、存储过程的控制语句一、正则表达式(REGEXP) 1、正则表达式匹配符 2、语法 SELECT 选项 FROM 表名 …...
Python基于周立功盒子的二次开发的准备工作
Python基于周立功盒子的二次开发的准备工作 一、基本介绍 基于周立功的二次开发是python通过调用zlgcan.dll,来实现CAN卡的通讯收发报文的,在python中通过ctypes模块调用c++动态库的接口函数(zlgcan.dll),我们需要根据我的电脑选择相对应版本的dll,比如64位的操…...
2023年PMP考生|考前必练全真模拟题分享,附答案解析
“日日行,不怕千万里;常常做,不怕千万事。”每日五题,备考无压力! 1、敏捷项目以价值为驱动交付,确定好所有待办事项的价值进而去制造可交付成果。那么在整个敏捷项目周期中,衡量团队交付的可交…...
Python入门教程+项目实战-7.1节: 条件控制结构
目录 7.1.1 理解条件控制 7.1.2 if,elif,else 7.1.3 条件表达式 7.1.4 条件控制可以嵌套 7.1.5 if语句的三元运算 7.1.6 系统学习python 7.1.1 理解条件控制 在日常生活中,我们常喜欢说如果, "如果怎么样,那么就会怎么样"。"如果&…...
【机器学习】P4 特征缩放与学习率
这里写自定义目录标题特征缩放标准化归一化平均值归一化收敛学习率特征缩放 特征缩放(Feature scaling)是一种数据预处理技术,它用于将不同尺度的特征值缩放到相同的范围内,以便更好地应用于机器学习算法中。在不进行特征缩放的情…...
《Python编程:从入门到实战》(第2版)学习笔记 第11章 测试代码
【写在前面】为进一步提高自己的python代码能力,打算把几本经典书籍重新过一遍,形成系统的知识体系,同时适当记录一些学习笔记,我尽量及时更新!先从经典的《Python编程:从入门到实战》书籍开始吧。有问题欢…...
SpringBoot(1)基础入门
SpringBoot基础入门SpringBoot项目创建方式Idea创建SpringBoot官网创建基于阿里云创建项目手工搭建SpringBoot启动parentstarter引导类内嵌tomcat基础配置属性配置配置文件分类yaml文件yaml数据读取整合第三方技术整合JUnit整合MyBatis整合Mybatis-Plus整合DruidSpringBoot是由…...
利用Flow Simulation快速经济高效地解决传热难题
几乎一切事物都会经历某种程度的发热或冷却,而且对于许多产品来说,热管理已成为避免过度发热和实现功能正常运行的一个关键要求。能够有效解决传热问题的制造商将会在竞争中占有明显的优势。利用一个简单易用的流体分析应用程序 SOLIDWORKS Flow Simulat…...
揭开二维码背后的神秘面纱用二维码识别 API 就够了
写在前面 二维码(QR code)已经成为现代生活中不可或缺的一部分。二维码具有可靠性、快速识别、易于存储等优点,因此在广泛应用于支付、门票、社交网络、广告等方面。但是,对于大多数人来说,二维码背后的编码方式是完全…...
C++_核心编程_多态案例二-制作饮品
#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...
springboot 百货中心供应链管理系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...
Mac软件卸载指南,简单易懂!
刚和Adobe分手,它却总在Library里给你写"回忆录"?卸载的Final Cut Pro像电子幽灵般阴魂不散?总是会有残留文件,别慌!这份Mac软件卸载指南,将用最硬核的方式教你"数字分手术"࿰…...
【单片机期末】单片机系统设计
主要内容:系统状态机,系统时基,系统需求分析,系统构建,系统状态流图 一、题目要求 二、绘制系统状态流图 题目:根据上述描述绘制系统状态流图,注明状态转移条件及方向。 三、利用定时器产生时…...
PL0语法,分析器实现!
简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...
如何在网页里填写 PDF 表格?
有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据ÿ…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...
技术栈RabbitMq的介绍和使用
目录 1. 什么是消息队列?2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...
代码规范和架构【立芯理论一】(2025.06.08)
1、代码规范的目标 代码简洁精炼、美观,可持续性好高效率高复用,可移植性好高内聚,低耦合没有冗余规范性,代码有规可循,可以看出自己当时的思考过程特殊排版,特殊语法,特殊指令,必须…...
