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

CMakeLists.txt学习

一:

#是行注释 ,[[ 块注释 ]]

0.cmake_minimum_required:  指定使用的cmake的最低版本

1.project()  定义工程名称

并可以指定工程的版本,工程描述,web主页地址,支持的语言(默认情况支持所有语言)

2.add_executable(可执行程序名 源文件)  源文件可以为多个,可以使用空格或分号间隔

例子 add_executable(app add.c div.c main.c)    add_executable(app add.c;div.c;main.c)  

CMakeLists.txt例子

#cmake本地最小版本要求3.0.9
cmake_minimum_required(VERSION 3.0.9)
#工程名称为test
project(test)
#根据源文件生成可执行文件
add_executable(app add.cpp div.cpp mult.cpp main.cpp sub.cpp)

执行命令

#cmake 后面跟上CMakeLists.txt的路径
#CMakeLists.txt在当前路径
cmake ./

cmake执行后,会多出来一些文件,生成的文件在主目录中会让文件结构较为混乱

CMakeCache.txt   #生成的
CMakeFile #生成的文件
app  #生成的可执行文件
cmake_install.cmake   #
Makefile  #生成的

在linux系统下,在CMakeLists.txt所在目录touch/mkdir创建一个build文件,进入其中,执行

cmake ../
#就会生成上面哪些文件在build中,在此目录生成了makefile,执行make
make  #就会执行可执行文件

通过这种方式可以生成一个简单项目的构建,如果这个项目里面文件特别多的情况下,是没有办法通过这种方式构建的,cmake提供了文件搜索命令解决这种问题

在CMakeLists.txt所在目录要删除执行cmake命令生成的文件,重新执行cmake才会让哪些文件生成在build文件中,然后在build文件目录下执行make命令才会生成可执行文件

二:add_executable(可执行文件 源文件),SET用法

可以在cmake中定义变量

set(string字符串)  cmake里面set命令里面一切皆为字符串

#VAR是变量名   VALUE是变量值
set(VAR VALUE)
例子:
#相当于变量值所有会存储在变量名里面,相当于对这个变量做了初始化
set(exe add.c;div.c;main.c;sub.c)
#根据初始化的变量,也就是定义的源文件生成可执行文件
#${变量名}  通过这种方式才能取变量的值
add_excutable(app ${exe})

C++标准,在编写C++程序时候,可能会用到C++11,C++14,C++17,C++20等新特性,那么就需要在编译的时候指定出要使用那个标准

1.在CMakeLists.txt通过set命令指定一个固定的宏的值

#添加-std=c++11
set(CMAKE_CXX_STANDARD 11)  #使用C++11的标准
#添加-std=C++14   CMAKE_CXX_STANDARD是一个标准宏,用于指定标准
set(CMAKE_CXX_STANDARD 14)

2.在执行cmake命令的时候指定出这个宏的值

#增加-std=c++11,运行这个命令会生成一个makefile,指定的标准就会生成在这个makefile文件里面去了
# -D的作用是指定宏的值
cmake CMakeLists.txt文件路径 -DCMAKE_CXX_STANDARD=11
#同样

3.在CMake中指定可执行程序指定输出的路径,也对应一个宏,叫做EXCUTABLE_OUTPUT_PATH,它的值也是通过set()命令进行设置

set(HOME /home/robin/Linux/Sort)
#指定生成可执行文件的路径,最好为绝对路径,这样项目地址更改后生成的可执行文件绝对地址不变
set(EXECUTABLE_OUTPUT_PATH ${HOME}/bin)

三.搜索文件 、

set(变量名 变量值)

 add_executable(可执行文件 源文件)

生成可执行文件时候,当源文件较多的时候,就要用到cmake提供的aux_source_dirctory命令查找某个路径下的所有源文件,命令格式为

方式1.aux_source_dirctory(<div> <variable>)  <div>要搜索的目录  <variable>:将从dir目录下搜索到的源文件列表存储到该变量中

#将
aux_source_directory(<目录> <variable>)
#上条命令将目录下的源文件搜索到变量中
#使用以下命令生成可执行文件通过源文件搜索到变量
add_executable(app ${variable})#宏PROJECT_SOURCE_DIR是CMakeLists.txt所在目录
aux_source_directory(${PROJECT_SOURCE_DIR} SRC)
#将SRC变量搜索到的文件作为源文件生成app
add_executable(app ${SRC})

方式2. 如果一个项目中源文件过多,在编写CMakeLists.txt文件的时候不可能将项目中目录的各个文件一一罗列出来,所以在cmake中我们提供了搜索文件的命令,就是file,当然除了搜索外。file也可以做其他事情

file(GLOB/GLOB_RECURSE 变量名 要搜索的文件路径和文件类型)

GLOB:将指定目录下搜索到的满足条件的所有文件名生成一个列表,并将其存储到变量中

GLOB_RECURSE:递归搜索指定目录,将搜索到的满足条件的文件名生成一个列表,并将其存储到变量中。

#将目录下的.c或.h文件搜集到变量中
#file(GLOB/GLOB_RECURSE 变量名 要搜索的文件路径和文件类型)
file(GLOB MAIN_SRC ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp)
file(GLOB MAIN_HEAD ${CMAKE_CURRENT_SOURCE_DIR}/include/*.h)

在完整CMakeLists.txt中file用法

cmake_mimimum_required(VERSION x.x.x)
project(test)
#使用以下命令通过源文件搜索到变量
#aux_source_directory(${PROJECT_SOURCE_DIR} SRC)
file(GLOB SRC ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp)
set(EXECUTABLE_OUTPUT_PATH /home/xx/xx/xx)
#通过file文件搜索到的CMakeLists.txt所在目录下所有文件作为源文件
add_executable(app ${SRC})

指定头文件路径命令

#PROJECT_SOURCE_DIR这个宏是CMakeLists.txt所在目录下的,它下面的include文件就是头文件路径,按实际情况而定
#指定存储头文件所在的目录
include_directories(${PROJECT_SOURCE_DIR}/include)

四.通过cmake制定库文件

1.静态库和动态库

add_library(库名称 STATIC 源文件1 【源文件2】 ...)

add_library(库名称 SHARED 源文件1 【源文件2】 ...)   生成动态库 ,库名称

在linux中,静态库名字分为三部分:lib+库名字+.a,此处只需要指定出库的名字就可以了,另外两部分在生成该文件的时候会自动填充

.名字组成为: lib+xxx+.a  xxx是名字, 如果是动态库,.a后缀在linux中是so,在windows里面是dll

.如果是静态库 :lib+xxx+ .lib(windows系统中)  如果是linux系统后缀是.a

动态库和静态库都由三部分组成

#动态库的制作,将SRC对应文件制作为动态库calc.so 或者calc.dll(windows下)
add_library(calc SHARED ${SRC})
#cmake会生成calc.so,动态库是具有可执行权限的
#静态库则为
add_library(calc STATIC ${SRC})
#静态库命令执行后会生成calc.a 但是不具有可执行权限

库文件的制作本质是将源代码的文本形式转换为二进制形式

2.指定库生成路径

使用宏LIBRARY_OUTPUT_PATH 

#指定库文件生成路径,如果没有这个路径,生成库文件之前会生成这个路径
set(LIBRARY_OUTPUT_PATH /home/xx/xx/xx)
add_library(calc STATIC ${SRC})
#执行cmake命令则会生成calc.a静态库文件在/home/xx/xx/xx路径下
add_library(calc SHARED ${SRC})
#执行cmake命令会将SRC源文件生成calc.so动态库文件在同样目录下

五.在程序中链接静态库文件

测试生成的动态库或静态库能不能用

首先,我们要把制作出的库文件发布出去,然后就是打包头文件,因为头文件里面有库文件里面一系列函数的声明。

#将静态库和动态库放置在不同库目录下

http://www.lryc.cn/news/609770.html

相关文章:

  • 《JavaScript高级程序设计》读书笔记 35 - 代理捕获器、反射方法以及代理模式
  • React 19 + Next.js 15 中实现混合布局
  • React配置proxy跨域
  • ref和reactive的区别
  • 通过 Flink 和 CDC 从 Oracle 数据库获取增量数据,并将这些增量数据同步到 MySQL 数据库中
  • [GESP202306 四级] 2023年6月GESP C++四级上机题超详细题解,附带讲解视频!
  • Spring Boot + ShardingSphere 实现分库分表 + 读写分离实战
  • AWS VPC Transit Gateway 可观测最佳实践
  • 【物联网】基于树莓派的物联网开发【23】——树莓派安装SQLite嵌入式数据库
  • 16_OpenCV_漫水填充(floodFill)
  • Nginx vs Spring Cloud Gateway:限流功能深度对比与实践指南
  • Spring Cloud Gateway 实现登录校验:构建统一认证入口
  • 图片的放大缩小选择全屏
  • XSS的原型链污染1--原型链解释
  • 笔记本电脑联想T14重启后无法识别外置红米屏幕
  • Django + Vue 项目部署(1panel + openresty)
  • AI“炼金术”:破解绿色水泥的配方密码
  • 三防平板电脑是什么?这款三防平板支持红外测温!
  • 电脑上不了网怎么办?【图文详解】wifi有网络但是电脑连不上网?网络设置
  • 电脑一键重装系统win7/win10/win11无需U盘(无任何捆绑软件图文教程)
  • Ribbon 核心原理与架构详解:服务负载均衡的隐形支柱
  • 工作流绑定卡片优化用户体验-练习我要找工作智能体
  • 【CVPR2025】计算机视觉|AnomalyNCD:让工业异常分类“脱胎换骨”!
  • transformer与神经网络
  • ubuntu24.01安装odoo18
  • 纯前端使用ExcelJS插件导出Excel
  • 计算机视觉(2)车规摄像头标准
  • 5天挑战网络编程 -DAY1(linux版)
  • python:讲懂决策树,为理解随机森林算法做准备,以示例带学习,通俗易懂,容易理解和掌握
  • 句子表征-文本匹配--representation-based/interactive-based