【Linux】Linux工具——CMake入门

news2024/11/19 3:22:08

目录

1.什么是CMake

2.CMakeflie的安装和版本的查看

3.几个简单示例 

3.1.编译一个.cc文件

3.2.编译一个.hpp文件和一个.cc文件

 3.3.编译一个.hpp文件和两个.cc文件

3.4.编译两个.hpp文件和一个.cc文件

4.CMakeLists.txt

4.1.CMakeLists.txt常用的几条指令

4.2.变量和缓存

4.2.1.变量定义与使用

4.2.2.缓存变量

4.3.查找库和包

4.3.1.find_package() 指令

4.3.2.使用第三方库


1.什么是CMake

        Makefile想必大家都不陌生吧,它能够解决我们的自动化编译问题,大多是IDE软件都集成了make,譬如 Visual C++的 nmake、linux 下的 GNU make、Qt 的 qmake 等等。

        不同的IDE所集成的make工具所遵循的规范和标准都不同,也就导致其语法、格式不同,也就不能很好的跨平台编译,会再次使得工作繁琐起来

        那么cmake为了解决这个问题而诞生了,其允许开发者指定整个工程的编译流程,在根据编译平台,生成本地化的Makefile和工程文件,最后用户只需make编译即可

        简而言之,可以把cmake看成一款自动生成 Makefile的工具,所以编译流程就变成了:cmake—>make–>用户代码–>可执行文件

2.CMakeflie的安装和版本的查看

首先我们需要安装我们的CMake

sudo yum install cmake

然后我们可以通过

cmake -version

 来查看自己的cmake的版本

3.几个简单示例 

事实上,cmake的用法特别简单

  1. 编写CMakeLists.txt
  2. 执行命令cmake .
  3. 执行命令make
  4. 运行执行程序

看几个例子来 

3.1.编译一个.cc文件

首先让我们从最简单的代码入手,先来体验下cmake是如何操作的。编写main.cc,如下,

#include <stdio.h>

int main(void)
{
	printf("Hello World\n");

	return 0;
}

然后在main.cc相同目录下编写CMakeLists.txt,内容如下,

cmake_minimum_required (VERSION 2.8)

project (demo)

add_executable(main main.cc)
  • 第一行意思是表示cmake的最低版本要求是2.8,我们安装的是3.20.2;
  • 第二行是表示本工程信息,也就是工程名叫demo;
  • 第三行比较关键,表示最终要生成的elf文件的名字叫main,使用的源文件是main.cc

在终端下切到main.cc所在的目录下,然后输入以下命令运行下面这个命令

cmake .

执行之后,就会有下面这样子的情况发生 

我们再看看当前目录下面 

我们发现当前目录下面有Makefile了,我们打开看看

好像不认识啊 ,这个我们不管,我们退出来make一下 

完美啊!

3.2.编译一个.hpp文件和一个.cc文件

接下来我将编译一个.hpp文件和一个.cc文件

method.hpp

#pragma once
#include<iostream>

void Printf()
{
    std::cout<<"hello world!"<<std::endl;
}

main.cc 

#include"method.hpp"

int main()
{
    Printf();
}

 CMakeLists.txt

cmake_minimum_required(VERSION 2.8)  
  
project(demo)  
  
# 添加可执行文件,只需要列出源文件,头文件不需要列出  
add_executable(main main.cc)  
  
#  method.hpp 是 main.cc 依赖的头文件,确保它位于正确的路径下  
# CMake 会自动处理包含路径(如果设置了正确的包含目录)  
# 如果需要,可以使用 include_directories 来指定头文件搜索路径  
# include_directories(path/to/headers)  
# 但头文件和源文件在同一目录下,通常不需要这样做

 我们执行

cmake .

 

 

完美!

 3.3.编译一个.hpp文件和两个.cc文件

接下来进入稍微复杂的例子:这次我们决定编译一个.h文件和两个.cc文件

method.hpp

#pragma once
#include<iostream>

void Printf();

method.cc 

#include"method.hpp"

void Printf()
{
    std::cout<<"hello world"<<std::endl;
}

 main.cc

#include"method.hpp"

int main()
{
    Printf();
}

我们现在就来编写CMakeLists.txt

CMakeLists.txt

cmake_minimum_required (VERSION 2.8)

project (demo)

add_executable(main main.cc method.cc)

注意我这里只是在main.cc后面加路method.cc 

我们使用一下

cmake .

 

完美啊!! 

3.4.编译两个.hpp文件和一个.cc文件

接下来我们将使用method.hpp,way.hpp,main.cc文件来编译

way.hpp 

#pragma once
#include<iostream>
void Printf1()
{
    std::cout<<"Printf1"<<std::endl;
}

method.hpp 

#pragma once
#include<iostream>
void Printf2()
{
    std::cout<<"Printf2"<<std::endl;
}

 main.cc

#include"way.hpp"
#include"method.hpp"

int main()
{
    Printf1();
    Printf2();
}

 CMakeLists.txt

cmake_minimum_required (VERSION 2.8)

project (demo)

add_executable(main main.cc)

 注意:因为我这里只有一个源文件,所以我们写一个main.cc就好

我们执行

cmake .

 

完美! 

4.CMakeLists.txt

        编写CMakeLists.txt最常用的功能就是调用其他的.h头文件和.so/.a库文件,将.cpp/.c/.cc文件编译成可执行文件或者新的库文件。

4.1.CMakeLists.txt常用的几条指令

CMakeLists.txt 文件使用一系列的 CMake 指令来描述构建过程。常见的指令包括:

1、指定 CMake 的最低版本要求:

cmake_minimum_required(VERSION <version>)

例如:

cmake_minimum_required(VERSION 3.10)

2、定义项目的名称和使用的编程语言:

project(<project_name> [<language>...])

例如:

project(MyProject CXX)

3、指定要生成的可执行文件和其源文件:

add_executable(<target> <source_files>...)

例如:

add_executable(MyExecutable main.cpp other_file.cpp)

4、创建一个库(静态库或动态库)及其源文件:

add_library(<target> <source_files>...)

例如:

add_library(MyLibrary STATIC library.cpp)

5、链接目标文件与其他库:

target_link_libraries(<target> <libraries>...)

例如:

target_link_libraries(MyExecutable MyLibrary)

6、添加头文件搜索路径:

include_directories(<dirs>...)

例如:

include_directories(${PROJECT_SOURCE_DIR}/include)

7、设置变量的值:

set(<variable> <value>...)

例如:

set(CMAKE_CXX_STANDARD 11)

8、设置目标属性:

target_include_directories(TARGET target_name
                          [BEFORE | AFTER]
                          [SYSTEM] [PUBLIC | PRIVATE | INTERFACE]
                          [items1...])

例如:

target_include_directories(MyExecutable PRIVATE ${PROJECT_SOURCE_DIR}/include)

9、安装规则:

install(TARGETS target1 [target2 ...]
        [RUNTIME DESTINATION dir]
        [LIBRARY DESTINATION dir]
        [ARCHIVE DESTINATION dir]
        [INCLUDES DESTINATION [dir ...]]
        [PRIVATE_HEADER DESTINATION dir]
        [PUBLIC_HEADER DESTINATION dir])

例如:

install(TARGETS MyExecutable RUNTIME DESTINATION bin)

10、条件语句 (if, elseif, else, endif 命令)

if(expression)
  # Commands
elseif(expression)
  # Commands
else()
  # Commands
endif()

例如:

if(CMAKE_BUILD_TYPE STREQUAL "Debug")
  message("Debug build")
endif()

11、自定义命令 (add_custom_command 命令):

add_custom_command(
   TARGET target
   PRE_BUILD | PRE_LINK | POST_BUILD
   COMMAND command1 [ARGS] [WORKING_DIRECTORY dir]
   [COMMAND command2 [ARGS]]
   [DEPENDS [depend1 [depend2 ...]]]
   [COMMENT comment]
   [VERBATIM]
)

例如:

add_custom_command(
   TARGET MyExecutable POST_BUILD
   COMMAND ${CMAKE_COMMAND} -E echo "Build completed."
)

实例

一个简单的 CMakeLists.txt 文件示例:

cmake_minimum_required(VERSION 3.10)
project(MyProject CXX)

# 添加源文件
add_executable(MyExecutable main.cpp)

# 设置 C++ 标准
set(CMAKE_CXX_STANDARD 11)

4.2.变量和缓存

CMake 使用变量来存储和传递信息,这些变量可以在 CMakeLists.txt 文件中定义和使用。

变量可以分为普通变量和缓存变量。

4.2.1.变量定义与使用

定义变量:

set(MY_VAR "Hello World")

使用变量:

message(STATUS "Variable MY_VAR is ${MY_VAR}")

4.2.2.缓存变量

缓存变量存储在 CMake 的缓存文件中,用户可以在 CMake 配置时修改这些值。缓存变量通常用于用户输入的设置,例如编译选项和路径。

定义缓存变量:

set(MY_CACHE_VAR "DefaultValue" CACHE STRING "A cache variable")

使用缓存变量:

message(STATUS "Cache variable MY_CACHE_VAR is ${MY_CACHE_VAR}")

4.3.查找库和包

CMake 可以通过 find_package() 指令自动检测和配置外部库和包。

常用于查找系统安装的库或第三方库。

4.3.1.find_package() 指令

基本用法:

find_package(Boost REQUIRED)

指定版本:

find_package(Boost 1.70 REQUIRED)

查找库并指定路径:

find_package(OpenCV REQUIRED PATHS /path/to/opencv)

使用查找到的库:

target_link_libraries(MyExecutable Boost::Boost)

设置包含目录和链接目录:

include_directories(${Boost_INCLUDE_DIRS})
link_directories(${Boost_LIBRARY_DIRS})

4.3.2.使用第三方库

假设你想在项目中使用 Boost 库,CMakeLists.txt 文件可能如下所示:

实例

cmake_minimum_required(VERSION 3.10)
project(MyProject CXX)

# 查找 Boost 库
find_package(Boost REQUIRED)

# 添加源文件
add_executable(MyExecutable main.cpp)

# 链接 Boost 库
target_link_libraries(MyExecutable Boost::Boost)

通过上述内容,用户可以了解 CMakeLists.txt 文件的基本结构和常用指令,掌握如何定义和使用变量,查找和配置外部库,从而能够有效地使用 CMake 管理项目构建过程。

 

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

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

相关文章

软件测试之单元测试/系统测试/集成测试详解

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、单元测试的概念 单元测试是对软件基本组成单元进行的测试&#xff0c;如函数或一个类的方法。当然这里的基本单元不仅仅指的是一个函数或者方法&#xff0…

基于densenet模型在RML201610a数据集上的调制识别【代码+数据集+python环境+GUI系统】

基于densenet模型在RML201610a数据集上的调制识别【代码数据集python环境GUI系统】 Loss曲线 背景意义 随着社会的快速发展&#xff0c;人们在通信方面的需求逐渐增加&#xff0c;特别是在无线通信领域。通信环境的复杂化催生了多种通信形式和相关应用&#xff0c;这使得调制…

最新版无忧二级域名分发源码,支持包月续费

目前版本支持&#xff0c;开通会员&#xff0c;会员组可以解析哪些域名 比如 用普通域名引流&#xff0c;免费使用&#xff0c;就可以注册就是普通用户组 会员组可以设置价格比如10块钱买永久会员&#xff0c;没有别的特权&#xff0c;只是会员才可以租备案域名&#xff0c; 设…

有源蜂鸣器(5V STM32)

目录 一、介绍 二、模块原理 1.有/无源蜂鸣器介绍 2.原理图 3.引脚描述 三、程序设计 main.c文件 beep.h文件 beep.c文件 四、实验效果 五、资料获取 项目分享 一、介绍 蜂鸣器是一种能将音频信号转化声音信号的发音器件&#xff0c;在家电器上&#xff0c;在银行…

直播 SDK

直播 SDK 是音视频终端 SDK&#xff08;腾讯云视立方&#xff09;针对移动直播场景专属打造的一体化产品&#xff0c;支持直播推拉流、主播观众互动连麦、主播跨房 PK 等能力&#xff0c;为用户提供高质量直播服务&#xff0c;快速满足手机直播的需求。更多关于直播 SDK 的文档…

Ubuntu 22.04无法连接网络(网络图标丢失)解决方案

对于Ubuntu 22.04而言&#xff1a; sudo service NetworkManager stop sudo rm /var/lib/NetworkManager/NetworkManager.state sudo service NetworkManager start

嵌入式项目:STM32平衡车详解 (基础知识篇) (基于STM32F103C8T6)

前言&#xff1a; 本文是基于B站草履虫编写的平衡车相关内容&#xff0c;包括模块和基础知识&#xff0c;结合代码进行讲解&#xff0c;将知识进行汇总 &#xff08;由于本篇内容较长&#xff0c;请结合目录使用) 注&#xff1a;基于开源精神&#xff0c;本文仅供学习参考 目…

基于Node.js+Express+MySQL+VUE实现的计算机毕业设计旅游推荐网站

猜你喜欢评论 登录注册搜索 推荐定制景点/springboot/javaWEB/J2EE/MYSQL数据库/vue前后分离小程序 功能图如下所示&#xff1a; 一、设计目标 本次计算机毕业设计项目的主要目标是设计和开发一款功能完善、用户友好的旅游推荐网站。该网站旨在为广大旅游爱好者提供一个便捷、…

蓝桥杯--STM32G431RBT6(TIM定时器的输出频率和占空比,含详细原理介绍和使用方法)

目录 一、前言 二、代码 实现功能&#xff1a;​编辑 按如图配置 定义变量 编写执行代码 显示在LCD上 加入按键效果 三、效果展示 四、代码开源 一、前言 ARR 即自动重装载值&#xff08;Auto Reload Register&#xff09;。相当于一个水杯&#xff0c;水杯容量&am…

sqlserver迁移数据库文件存储位置

业务背景&#xff1a;由于C盘爆满&#xff0c;需要将数据库文件迁移到别处比如D盘 下面以某一个数据库转移为示例&#xff1a;&#xff08;可以用SSMS工具&#xff0c;新建查询配合使用&#xff09; 1.查询数据库文件存储路径 sql语句&#xff1a; -- 查询路径 USE QiangTes…

[Redis][哨兵][上]详细讲解

目录 0.前言1.基本概念1.相关名词解释2.主从复制的问题3.人工恢复主节点故障4.哨兵自动恢复主节点故障 0.前言 说明&#xff1a;该章节相关操作不需要记忆&#xff0c;理解流程和原理即可&#xff0c;用的时候能自主查到即可Redis的主从复制模式下&#xff0c;⼀旦主节点由于故…

使用豆包MarsCode 实现高可用扫描工具

以下是「 豆包MarsCode 体验官」优秀文章&#xff0c;作者郝同学测开笔记。 前言&#xfeff; 最近接触K8s&#xff0c;了解到K8s提供了非常方便的实现高可用的能力&#xff0c;再加上掘金推出「豆包MarsCode初体验」征文活动&#xff0c;所以打算使用豆包 MarsCode IDE来实现…

UniApp基于xe-upload实现文件上传组件

xe-upload地址&#xff1a;文件选择、文件上传组件&#xff08;图片&#xff0c;视频&#xff0c;文件等&#xff09; - DCloud 插件市场 致敬开发者&#xff01;&#xff01;&#xff01; 感觉好用的话&#xff0c;给xe-upload的作者一个好评 背景&#xff1a;开发中经常会有…

Dubbo快速入门(一):分布式与微服务、Dubbo基本概念

文章目录 一、分布式与微服务概念1.大型互联网架构目标2.集群和分布式&#xff08;1&#xff09;集群 (Cluster)&#xff08;2&#xff09;分布式计算 (Distributed Computing)&#xff08;3&#xff09;集群与分布式的关系&#xff08;4&#xff09;实践中的应用案例 3.架构演…

【AI大模型】向量及向量知识库

一、词向量与向量 什么是词向量 在机器学习和自然语言处理&#xff08;NLP&#xff09;中&#xff0c;词向量&#xff08;word embedding&#xff09;是一种以单词为单位将每个单词转化为实数向量的技术。这些实数向量可以被计算机更好地理解和处理。 词向量背后的主要想法是…

.NET 6 中,使用 ActionFilterAttribute 实现 AOP(面向切面编程)

AOP概述&#xff1a;AOP&#xff08;面向切面编程&#xff09;是一种编程规范的风格&#xff0c;通过横切的思想&#xff0c;将系统功能和业务功能分离开&#xff0c;以提高代码的可维护性和清晰度。 系统功能模块&#xff1a; 1、缓存模块&#xff1a; 作用&#xff1a;提高…

OpenHarmony(鸿蒙南向)——平台驱动指南【MIPI CSI】

往期知识点记录&#xff1a; 鸿蒙&#xff08;HarmonyOS&#xff09;应用层开发&#xff08;北向&#xff09;知识点汇总 鸿蒙&#xff08;OpenHarmony&#xff09;南向开发保姆级知识点汇总~ 持续更新中…… 概述 功能简介 CSI&#xff08;Camera Serial Interface&#xf…

wx小程序中,商城订单详情显示还有多少分钟关闭

问题&#xff1a;wx小程序中&#xff0c;商城订单详情需要显示还有多少分钟关闭 思路&#xff1a;创建订单时间戳和当前时间戳相减&#xff0c;得到时间差&#xff0c;再除1000&#xff0c;得到相差秒数&#xff0c;然后除60&#xff0c;向下取整&#xff0c;得到分钟。 代码如…

物联网行业中模组的AT指令详解以及使用

01 概述 AT 命令&#xff08;AT Commands&#xff09;最早是由发明拨号调制解调器&#xff08;MODEM&#xff09;的贺氏公司&#xff08;Hayes&#xff09;为了控制 MODEM 而发明的控制协议。后来随着网络带宽的升级&#xff0c;速度很低的拨号 MODEM 基本退出一般使用市场&am…

凌晨1点开播!Meta Connect 2024开发者大会,聚焦Llama新场景和AR眼镜

作者&#xff1a;十九 编辑&#xff1a;李宝珠 北京时间 9 月 26 日凌晨 1 点&#xff0c;Meta Connect 2024 开发者大会即将举行&#xff0c;马克扎克伯格将聚焦 AI 和元宇宙&#xff0c;向大家分享 Llama 模型的更多潜在应用&#xff0c;并介绍 Meta 最新产品 AR 眼镜和 Meta…