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

浅聊一下cmake

浅聊一下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}/build

PROJECT_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.kler.cn/a/17667.html

相关文章:

  • python——面向对象
  • 微信小程序的主体文件和页面文件介绍
  • 阿里云centos7.9服务器磁盘挂载,切换服务路径
  • 浅谈:基于三维场景的视频融合方法
  • elementui el-table中给表头 el-table-column 加一个鼠标移入提示说明
  • Sigrity SPEED2000 Power Ground Noise Simulation模式如何查看PDS系统的自阻抗操作指导
  • 降维算法详解:理论及示例代码实现
  • 自学SQL入门(2)
  • 如何写出高质量代码
  • UG NX二次开发(C++)-用UF_OBJ_cycle_objs_in_part遍历对象
  • 顺序表的基本操作(初始化,增,删,查,改等等)
  • 【c语言】字符串匹配(搜索) | API仿真
  • Nginx快速入门
  • I.MX6Q-SDB开发板移植ubuntu
  • MySQL5.7和MySQL8.0的区别是什么
  • 华为OD机试 - 优选核酸检测点(Python)
  • 操作系统(2.7)--进程
  • DAY 55 mysql数据库管理
  • 计算机专业还有前途吗?从业9年的程序员告诉你优缺点
  • MySQL知识学习04(MySQL事务隔离级别详解)
  • Elasticsearch --- 数据同步、集群
  • APP渗透—MobSF安全评估、frida、r0capture抓包
  • 倒排索引(Inverted Index)
  • Unity——Mirror学习(01)
  • c#笔记-运算符
  • 网卡丢失导致集群异常