浅聊一下cmake

news/2024/12/2 16:46:35/

浅聊一下cmake

什么是cmake

CMake是一个跨平台的编译工具,可以用简单的语句来描述所有平台的编译过程。

只要生成一份CMakeLists.txt文档,就可以利用CMake进行工程的搭建,能够输出各种各样的makefile或者project文件。

什么是makefile

makefile定义了一系列的规则来指定,哪些文件需要先编译,后编译,重新编译,甚至于进行更复杂的功能操作,有效地描述这些文件之间的依赖关系以及处理命令。

makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,而且当个别文件改动后仅执行必要的处理,而不必重复整个编译过程,极大的提高了软件开发的效率。

Linux下

安装

安装基本上直接bing或者Google搜索一堆傻瓜式教程。

如果对版本要求不高可以直接安装

sudo apt install cmake

但是不建议这样

可以自己去wget下载到home目录下然后操作

可以参考这个链接:ubuntu安装cmake-CSDN博客

基本操作

1.在源码中新建一个CMakeLists.txt

2.在CMakeLists.txt中写代码

3.之后通常基本操作都是

mkdir build
cd build
cmake ..
make
先创建build文件夹
进入build文件夹
执行cmake生成文件都在build文件夹内
执行make,就是执行cmake生成makefile文件,生成你所需的东西

4.如果修改cmake想重新生成可以,在build目录终端下

rm -rf *
cmake ..
make clean
make
先强制删除build里面所有文件
重新执行cmake
将之前make生成东西全部删除
重新生成

基本语法

浅聊一下自己要写cmake时,了解的一些语法

1.指定最低版本

cmake_minimum_required(VERSION 3.1)

指定最低版本,一般第一行都是这个

2.project

project(demo VERSION 1.0 DESCRIPTION "xxx" LANGUAGES CXX)

demo是你你创建的工程名字,VERSION是你发布版本,DESCRIPTION 项目的描述,LANGUAGES支持C/CXX/CSharp(3.8+),等C/C++为默认值

3.设置语言标准

set(CMAKE_C_STANDARD 99)
set(CMAKE_C_STANDARD_REQUIRED True)`set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)

4.搜索所有cpp文件

aux_source_directory(dir xxx) 把目录(dir)下所有的源代码文件并将列表存储在一个变量xxx中。

aux_source_directory(project/ ALL) # 搜索当前目录下的所有.cpp文件

5.自定义搜索规则

file(GLOB ALL "project/*.cpp" "src/*.cpp")

也可以用file将这个两个目录下cpp文件放到ALL中,file可以不只是cpp文件可以是自己要选择的文件

6.set 设置变量

set(ALL 1.cpp 2.cpp)

使1,2.cpp放到变量ALL中

7.包含哪些文件

add_library(demo 1.cpp 2.cpp 3.cpp)

也可以用上面把所有cpp文件都放到一个变量中然后包含到demo中,或者不想全部cpp也可以用set变量让一部分cpp放进去变量

8.生成动态库或者静态库

add_library(abc STATIC xxx) # 生成静态库
add_library(abc SHARED xxx) # 生成动态库

xxx可以是变量也可以是自己指定一些文件

add_library 默认生成是静态库,通过以上命令生成文件名字。

在 Linux 下是: libabc libabc.so

在 Windows 下是: abc.lib abc.dll

9.设置包含的目录

include_directories(${PROJECT_SOURCE_DIR}${PROJECT_SOURCE_DIR}/include
)

来包含头文件

10.添加路径使链接器应在其中搜索库

link_directories([AFTER|BEFORE] directory1 [directory2 …])

LINK_DIRECTORIES(${PROJECT_SOURCE_DIR}/lib/)

11.设置target需要链接的库

target_link_libraries( 目标库 目标库需要链接的库 )

target_link_libraries(demo -lpthread)

12.设置target需要头文件路径

target_include_directories(demo PUBLIC ${PROJECT_SOURCE_DIR}/include)

13.生成可执行文件

add_executable(demo main.c)

14.message打印

message(${ALL})

可以将自己想要的东西打印到终端,检查错误

15.循环

if

if(<condition>)
<commands>
elseif(<condition>)
<commands>
else()
<commands>
endif()

foreach

是由分号或空格分隔的项目列表。每次迭代开始变量 <loop_var> 被设置为当前项的值。

foreach(<loop_var> <items>)<commands>
endforeach()

while

如果 while命令,条件为真,则一直执行。

while(<condition>)<commands>
endwhile()

break和 continue 支持 foreach 循环 和while 循环。

我们使用 break()命令提前终止循环,而使用 continue()命令可用于立即开始下一次迭代。

16.常用变量

PROJECT_SOURCE_DIR:工程的根目录PROJECT_BINARY_DIR:运行cmake命令的目录,通常为${PROJECT_SOURCE_DIR}/buildPROJECT_NAME:返回通过 project 命令定义的项目名称CMAKE_CURRENT_SOURCE_DIR:当前处理的 CMakeLists.txt 所在的路径CMAKE_CURRENT_BINARY_DIR:target 编译目录CMAKE_CURRENT_LIST_DIR:CMakeLists.txt 的完整路径EXECUTABLE_OUTPUT_PATH:重新定义目标二进制可执行文件的存放位置LIBRARY_OUTPUT_PATH:重新定义目标链接库文件的存放位置

17.还有很多语法,用到在查

生成动态库的小案例

1.生成动态库

cmake_minimum_required(VERSION 3.10)
project(demo)#设置语言标准
SET(CMAKE_C_STANDARD 99)
set(CMAKE_C_STANDARD_REQUIRED True)SET(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)#拉取所有的.c文件
aux_source_directory(${PROJECT_SOURCE_DIR} ALL)message(${ALL})#生成动态库
add_library(demo SHARED ${ALL})#设置动态库输出目录
set(LIBRARY_OUTPUT_PATH ../lib)

2.使用

cmake_minimum_required(VERSION 3.10)
project(demo2)#设置语言标准
SET(CMAKE_C_STANDARD 99)
set(CMAKE_C_STANDARD_REQUIRED True)SET(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)#定义动态库位置
LINK_DIRECTORIES(${PROJECT_SOURCE_DIR}/lib/)#指定编译的可执行文件
add_executable(demo2 main.c)# 添加 ptpd 头文件路径
target_include_directories(demo2 PUBLIC ${PROJECT_SOURCE_DIR}/include)set(EXECUTABLE_OUTPUT_PATH ../out)

Windows下

Windows直接下载cmake就OK,他有个gui界面使用

我只是拿来编译别人的文件库,里面直接有CMakeLists.txt,拿来直接在gui中选择要编译的东西即可。

如果有qt,它里面就直接有cmake,可以直接使用qt里面的cmake来生成文件,但是qt里面是MinGW的,vs里面可能不能直接使用。


http://www.ppmy.cn/news/58328.html

相关文章

Docker部署spring boot项目

在docker部署时首先要保证一般部署能够访问。 docker命令部署spring boot项目 目前主流的java框架为spring&#xff0c;软件包为jar包&#xff0c;只需以jar为基础构建容器环境。打包为jar后只需要jvm就可以运行&#xff0c;因此需要以jdk为镜像构建容器。 基于命令构建jdk环…

[C++基础]-类和对象(下)

前言 作者&#xff1a;小蜗牛向前冲 名言&#xff1a;我可以接受失败&#xff0c;但我不能接受放弃 如果觉的博主的文章还不错的话&#xff0c;还请点赞&#xff0c;收藏&#xff0c;关注&#x1f440;支持博主。如果发现有问题的地方欢迎❀大家在评论区指正。 目录 一、深入学…

C++三大特性—继承“名字搜索与默认成员函数”

继承中的类的作用域 每个类定义自己的作用域&#xff0c;在这个作用域中定义自己的成员。当存在继承关系时&#xff0c;派生类的作用域嵌套在基类的作用域之中。如果一个名字在派生类的作用域中无法解析&#xff0c;那么编译器将继续在外层的基类中寻找该名字的定义。 继承关系…

运维——ssh无法登录云服务器

0x00 概述 一般来讲&#xff0c;无法登录ssh的原因挺多&#xff0c;如果无法登录云服务器&#xff0c;则除了要检查ssh端口是否放行&#xff0c;防火墙状态外&#xff0c;还需要检查云服务器web控制台入站规则是否开放了对应端口。如果你前面检查都是正常&#xff0c;那么还需…

你的个人AI助理Pi来了

还记得之前的文章《不要老盯着ChatGPT&#xff0c;这几家公司的产品同样不容小觑》提到的Inflection AI公司吗&#xff1f;通过其官方推文了解到&#xff0c;前期我们关注的个人AI助理有了新的进展&#xff0c;Pi开始对外发布。 Pi是什么 Pi 是一种 AI&#xff0c;一种旨在提供…

数据库之约束、索引和事务

一、约束 约束,顾名思义就是数据库对数据库中的数据所给出的一组检验规则.负责判断元素是否符合数据库要求.其目的就是为了提高效率以及准确性. 1.not null - > 数据元素非空 表示如果插入数据,则当前数据不能为空. //创建一张学生表,其班级id和年级id不为空 create …

项目集的定义及管理

一、什么是项目集 项目集是相互关联且被协调管理的项目、子项目集和项目集活动&#xff0c;以便获得分别管理所无法获 得的效益。 以项目集的形式管理项目、子项目集及项目集活动能确保项目集组件的战略和工作计划根据各组 件的成果做出相应调整&#xff0c;或者按照发起组织的…

Hive3面试基础

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、基本知识Hive31.表的类型和表的存储格式a)b)c)创建表i&#xff09;ii&#xff09; 2.表 二、使用步骤1.引入库2.读入数据 总结 前言 面试准备之Hive 回顾…