CMakeList

news2025/6/26 10:31:36

目录

.1 简介

.2 常用命令

2.1 指定 cmake 的最小版本

2.2 设置项目名称

2.3 设置编译类型

2.4 指定编译包含的源文件

2.4.1 明确指定包含哪些源文件

 2.4.2 搜索所有的 cpp 文件

2.4.3自定义搜索规则

2.5 查找指定的库文件

2.6. 设置包含的目录

2.7. 设置链接库搜索目录

2.8. 设置 target 需要链接的库

2.8.1 指定链接动态库或静态库

2.8.2 指定全路径

2.8.3 指定链接多个库

.3 常用变量

3.1 预定义变量 

3.2 环境变量 

3.3. 系统信息

3.4. 主要开关选项

3.5 设置变量

3.5.1 set 直接设置变量的值

3.5.2 set 追加设置变量的值

3.5.3 list 追加或者删除变量的值

.4 项目示例

4.1 创建

4.2 编码

4.3 编写CMakeLists 

4.4 编译和运行

​4.5 运行 

.1 简介

编译是依赖CMakeList来进行的

cmake 是一个跨平台、开源的构建系统。它是一个集软件构建、测试、打包于一身的软件。它使用与平台和编译器独立的配置文件来对软件编译过程进行控制。

.2 常用命令

2.1 指定 cmake 的最小版本

cmake_minimum_required(VERSION 3.4.1)

这行命令是可选的,我们可以不写这句话,但在有些情况下,如果 CMakeLists.txt 文件中使用了一些高版本 cmake 特有的一些命令的时候,就需要加上这样一行,提醒用户升级到该版本之后再执行 cmake。

2.2 设置项目名称

project(demo)

这里的例子是设置成了路径名称

2.3 设置编译类型

add_executable(demo demo.cpp) # 生成可执行文件
add_library(common STATIC util.cpp) # 生成静态库
add_library(common SHARED util.cpp) # 生成动态库或共享库

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

  • 在 Linux 下是:
    demo
    libcommon.a
    libcommon.so
  • 在 Windows 下是:
    demo.exe
    common.lib
    common.dll

 比如说上图就是对主函数所在的文件设生成可执行文件,当然可以有多个主函数文件

2.4 指定编译包含的源文件

2.4.1 明确指定包含哪些源文件

add_library(demo demo.cpp test.cpp util.cpp)

 2.4.2 搜索所有的 cpp 文件

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

aux_source_directory(. SRC_LIST) # 搜索当前目录下的所有.cpp文件
add_library(demo ${SRC_LIST})

2.4.3自定义搜索规则

file(GLOB SRC_LIST "*.cpp" "protocol/*.cpp")
add_library(demo ${SRC_LIST})
# 或者
file(GLOB SRC_LIST "*.cpp")
file(GLOB SRC_PROTOCOL_LIST "protocol/*.cpp")
add_library(demo ${SRC_LIST} ${SRC_PROTOCOL_LIST})
# 或者
file(GLOB_RECURSE SRC_LIST "*.cpp") #递归搜索
FILE(GLOB SRC_PROTOCOL RELATIVE "protocol" "*.cpp") # 相对protocol目录下搜索
add_library(demo ${SRC_LIST} ${SRC_PROTOCOL_LIST})
# 或者
aux_source_directory(. SRC_LIST)
aux_source_directory(protocol SRC_PROTOCOL_LIST)
add_library(demo ${SRC_LIST} ${SRC_PROTOCOL_LIST})

2.5 查找指定的库文件

find_library(VAR name path)查找到指定的预编译库,并将它的路径存储在变量中。
默认的搜索路径为 cmake 包含的系统库,因此如果是 NDK 的公共库只需要指定库的 name 即可。

find_library( # Sets the name of the path variable.
              log-lib
 
              # Specifies the name of the NDK library that
              # you want CMake to locate.
              log )

类似的命令还有 find_file()、find_path()、find_program()、find_package()。

2.6. 设置包含的目录

    include_directories(
        ${CMAKE_CURRENT_SOURCE_DIR}
        ${CMAKE_CURRENT_BINARY_DIR}
        ${CMAKE_CURRENT_SOURCE_DIR}/include
    )

Linux 下还可以通过如下方式设置包含的目录

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -I${CMAKE_CURRENT_SOURCE_DIR}")

2.7. 设置链接库搜索目录

    link_directories(
        ${CMAKE_CURRENT_SOURCE_DIR}/libs
    )

Linux 下还可以通过如下方式设置包含的目录

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -L${CMAKE_CURRENT_SOURCE_DIR}/libs")

2.8. 设置 target 需要链接的库

    target_link_libraries( # 目标库
                           demo
     
                           # 目标库需要链接的库
                           # log-lib 是上面 find_library 指定的变量名
                           ${log-lib} )

在 Windows 下,系统会根据链接库目录,搜索xxx.lib 文件,Linux 下会搜索 xxx.so 或者 xxx.a 文件,如果都存在会优先链接动态库(so 后缀)。

2.8.1 指定链接动态库或静态库

    target_link_libraries(demo libface.a) # 链接libface.a
    target_link_libraries(demo libface.so) # 链接libface.so

2.8.2 指定全路径

    target_link_libraries(demo ${CMAKE_CURRENT_SOURCE_DIR}/libs/libface.a)
    target_link_libraries(demo ${CMAKE_CURRENT_SOURCE_DIR}/libs/libface.so)

2.8.3 指定链接多个库

    target_link_libraries(demo
        ${CMAKE_CURRENT_SOURCE_DIR}/libs/libface.a
        boost_system.a
        boost_thread
        pthread)

.3 常用变量

3.1 预定义变量 

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 的完整路径
CMAKE_CURRENT_LIST_LINE:当前所在的行
CMAKE_MODULE_PATH:定义自己的 cmake 模块所在的路径,SET(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake),然后可以用INCLUDE命令来调用自己的模块
EXECUTABLE_OUTPUT_PATH:重新定义目标二进制可执行文件的存放位置
LIBRARY_OUTPUT_PATH:重新定义目标链接库文件的存放位置

3.2 环境变量 

 $ENV{Name}

写入环境变量

 set(ENV{Name} value) # 这里没有“$”符号

3.3. 系统信息

­CMAKE_MAJOR_VERSION:cmake 主版本号,比如 3.4.1 中的 3
­CMAKE_MINOR_VERSION:cmake 次版本号,比如 3.4.1 中的 4
­CMAKE_PATCH_VERSION:cmake 补丁等级,比如 3.4.1 中的 1
­CMAKE_SYSTEM:系统名称,比如 Linux-­2.6.22
­CMAKE_SYSTEM_NAME:不包含版本的系统名,比如 Linux
­CMAKE_SYSTEM_VERSION:系统版本,比如 2.6.22
­CMAKE_SYSTEM_PROCESSOR:处理器名称,比如 i686
­UNIX:在所有的类 UNIX 平台下该值为 TRUE,包括 OS X 和 cygwin
­WIN32:在所有的 win32 平台下该值为 TRUE,包括 cygwin

3.4. 主要开关选项

BUILD_SHARED_LIBS:这个开关用来控制默认的库编译方式,如果不进行设置,使用 add_library 又没有指定库类型的情况下,默认编译生成的库都是静态库。如果 set(BUILD_SHARED_LIBS ON) 后,默认生成的为动态库
CMAKE_C_FLAGS:设置 C 编译选项,也可以通过指令 add_definitions() 添加
CMAKE_CXX_FLAGS:设置 C++ 编译选项,也可以通过指令 add_definitions() 添加

add_definitions(-DENABLE_DEBUG -DABC) # 参数之间用空格分隔

3.5 设置变量

3.5.1 set 直接设置变量的值

    set(SRC_LIST main.cpp test.cpp)
    add_executable(demo ${SRC_LIST})

3.5.2 set 追加设置变量的值

    set(SRC_LIST main.cpp)
    set(SRC_LIST ${SRC_LIST} test.cpp)
    add_executable(demo ${SRC_LIST})

3.5.3 list 追加或者删除变量的值

    set(SRC_LIST main.cpp)
    list(APPEND SRC_LIST test.cpp)
    list(REMOVE_ITEM SRC_LIST main.cpp)
    add_executable(demo ${SRC_LIST})

.4 项目示例

4.1 创建

先创建一个目录

 

4.2 编码

然后新建一个文件写入代码

 

 

4.3 编写CMakeLists 

新建文件 CMakeLists.txt(命名必须是 CMakeLists.txt,注意大小写和不要漏字母) 

project(HELLO)
add_executable(hello main.c)

4.4 编译和运行

新建一个 build 文件夹,目录情况如下:

 为什么要新建一个 build 文件夹?
        一般我们采用 cmake 的 out-of-source 方式来构建(即生成的中间产物和源代码分离),这样做可以让生成的文件和源文件不会弄混,且目录结构看起来也会清晰明了。所以推荐使用这种方式,至于这个文件夹的命名并无限制,我们习惯命名为 build。
然后是编译

cd build
cmake ..

 运行后cmake生成以下文件

然后make,生成可执行程序,如下图:

4.5 运行 

运行程序,如下所示:运行程序,如下所示:

 

参考:

CMakeLists.txt 语法介绍与实例演练_阿飞__的博客-CSDN博客_cmakelist

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

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

相关文章

中国晶振市场规模将增长至2026年的263.21亿元,国产市场未来可期

晶振作为频率控制和频率选择基础元件,广泛应用于资讯设备、移动终端、通信及网络设备、汽车电子、智能电表、电子银行口令卡等领域,随着新兴电子产业、物联网的快速发展,及以 5G、蓝牙 5.0、Wi-Fi 6 等无线通信新技术的广泛应用,预…

基于Python的Flask WEB框架实现后台权限管理系统(含数据库),内容包含:用户管理、角色管理、资源管理和机构管理

#基于Flask实现后台权限管理系统 重磅!!!!!!!!!!! 全新的风格界面,完全的前后端分离。基于ElementUI,前端代码基于RuoYi…

plotly parallel_coordinates平行坐标可视化

使用plotly画平行坐标图,代码如下: 其中数据使用excel的csv格式(当然可以使用其它格式),csv的标头是参数名。 import plotly.express as px import numpy as np import pandas as pd# df px.data.iris() df pd.read…

【爬虫】JS逆向解决反爬问题系列3—sign破解

⭐️⭐️⭐️⭐️⭐️欢迎来到我的博客⭐️⭐️⭐️⭐️⭐️ 🐴作者:秋无之地 🐴简介:CSDN爬虫、后端、大数据领域创作者。目前从事python爬虫、后端和大数据等相关工作,主要擅长领域有:爬虫、后端、大数据开发、数据分析等。 🐴欢迎小伙伴们点赞👍🏻、收藏⭐️、…

DOM(一):获取页面元素、操作元素

DOM&#xff08;一&#xff09;获取页面元素事件操作元素获取页面元素 1.根据ID获取 使用getElementById()方法获取带有ID的元素对象,格式如下&#xff1a; var 变量名 document.getElementById(‘id名’); 例如&#xff1a; <div id time>2022-12-18</div> &…

PyTorch——应用一个已训练好的图片分类网络——AlexNet

1.识别一个图像主体的预训练网络 ImageNet数据集是由一个Stanford大学维护的包含1400多万幅图像的非常大的数据集&#xff0c;所有的图像都用来自WordNet数据集的名词层次结构标记&#xff0c;而WordNet数据集又是一个大型的英语词汇数据库。 1.1获取一个预先训练好的网络用于…

【矩阵论】7.范数理论——基本概念——矩阵范数生成向量范数谱范不等式

7.1.3 矩阵范数产生向量范数 CnnC^{n\times n}Cnn 上任一矩阵范数 ∥∙∥\Vert \bullet\Vert∥∙∥ 都产生一个向量范数 φ(X)∥X∥V\varphi(X)\Vert X\Vert_Vφ(X)∥X∥V​ 矩阵范数与向量范数的相容性&#xff1a;φ(Ax)≤∥A∥φ(x)\varphi(Ax)\le \Vert A\Vert\varphi(x)φ…

蓝牙耳机什么牌子好?音质好、配置高的蓝牙耳机分享

​经常听到很多网友在讨论哪些蓝牙耳机好用&#xff0c;什么蓝牙耳机的配置高......选购蓝牙耳机无非就是音质、蓝牙技术、续航、佩戴体验等各方面条件&#xff0c;还有哪位朋友不知道该如何选购蓝牙耳机的&#xff1f;根据我对蓝牙耳机的了解&#xff0c;从网上整理了好几款蓝…

【关于eps8266自动重启 Soft WDT reset】

【关于eps8266自动重启 Soft WDT reset】1. 前言2. 分析问题2.1 长时间没有喂狗2.2 delayMicroseconds 函数触发3. 解决问题3.1 解决长时间没有喂狗3.2 解决delayMicroseconds 函数触发5. 小结1. 前言 最近使用esp8266进行远程遥控时, 但是在驱动舵机servo库的过程中出现了esp…

第二证券|两大板块掀涨停潮,有个股猛拉20cm!这只港股复牌一度暴跌

A股商场周五上午窄幅震动&#xff0c;上证指数微涨0.09点&#xff0c;核算机等板块领涨。 新股体现持续分解&#xff0c;4只今日上市的新股中&#xff0c;两只科创板新股上涨&#xff0c;两只北交所新股则破发。 港股全体小幅调整&#xff0c;全体动摇不算大&#xff0c;但仍…

【推荐】智慧农业解决方案资料合集30篇

智慧农业 是农业中的智慧经济&#xff0c;智慧经济形态在农业中的具体表现。智慧农业是智慧经济重要的组成部分&#xff1b;对于发展中国家而言&#xff0c;智慧农业是智慧经济主要的组成部分&#xff0c;是发展中国家消除贫困、实现后发优势、经济发展后来居上、实现赶超战略的…

16含风光水的虚拟电厂与配电公司协调调度模型(场景削减MATLAB程序)

参考文献 含风光水的虚拟电厂与配电公司协调调度模型——董文略&#xff08;复现场景削减部分&#xff09; 主要内容 代码主要做的是风电、光伏以及电价场景不确定性模拟&#xff0c;首先由一组确定性的方案&#xff0c;生成50种光伏场景&#xff0c;为了避免大规模光伏场景…

小结 | 支持向量机 (SVM)

一.基本原理 SVM是一种二分类模型 基本思想&#xff1a;在特征空间中寻找间隔最大的分离超平面使数据得到高效的二分类&#xff0c;具体来讲&#xff0c;有三种情况&#xff08;不加核函数的话就是线性模型&#xff0c;加了之后才会升级为一个非线性模型&#xff09; 当训练…

MybatisPlus详解 | DQLDML快速开发... | 系统性学习 | 无知的我费曼笔记

无知的我正在复盘MybatisPlus&#xff0c;顺便上传笔记。。。 下图是我总结的 MP 知识的初级思维导图&#xff0c;后续会不断补充 文章目录1 MyBatisPlus入门案例与简介1.1 入门案例回顾SpringBoot整合Mybatis的开发过程:步骤1:创建数据库及表步骤2:创建SpringBoot工程步骤…

二苯并环辛炔-聚乙二醇-生物素DBCO-PEG-Biotin简介 DBCO-PEG-Biotin衍生物可以在没有金属催化剂(铜离子)作用下发生点击化学反应

中文名&#xff1a;二苯并环辛炔-聚乙二醇-生物素&#xff0c;生物素-聚乙二醇环辛炔 英文名&#xff1a;DBCO-PEG-Biotin&#xff0c;Biotin-PEG-DBCO 溶剂&#xff1a;溶于大部分有机溶剂&#xff0c;如&#xff1a;DCM、DMF、DMSO、THF等等&#xff0c;在水中有很好的溶解性…

变分自编码器VAE的数学原理

变分自编码器(VAE)是一种应用广泛的无监督学习方法&#xff0c;它的应用包括图像生成、表示学习和降维等。虽然在网络架构上经常与Auto-Encoder联系在一起&#xff0c;但VAE的理论基础和数学公式是截然不同的。本文将讨论是什么让VAE如此不同&#xff0c;并解释VAE如何连接“变…

【JVS低代码】一分钟学会如何快速创建应用

应用中心功能介绍 在JVS角色中有“应用管理员”的角色&#xff0c;如果赋予该角色&#xff0c;则用户为应用管理员&#xff0c;应用管理员有进入应用配置中心的权限。 创建空白应用&#xff1a; 从模板创建应用&#xff1a; 应用中心入口 具备应用管理员权限的用户&#xff…

嵌入式软件开发为什么需要DevOps?

DevOps提出至今已逾十年&#xff0c;作为热门概念&#xff0c;DevOps近年来频频出现于各大技术社区和媒体文章中&#xff0c;备受行业大咖追捧。作为新一代持续集成/持续开发&#xff08;CI/CD&#xff09;的方法论&#xff0c;DevOps正被快速引入嵌入式软件开发领域中。 为什…

【C++】类和对象(C++门槛)

唯有奋力奔跑&#xff0c;才能方得始终。 文章目录一、struct > class(类 方法/成员函数 属性/成员变量)1.自定义类型 struct 和 class 的区别2.类放在内存中的什么存储区&#xff1f;3.类中函数的两种定义方式3.1 声明和定义分离&#xff08;增强代码可读性&#xff0c;…

docker 搭建 Nuget 服务器,CentOS,宝塔面板

docker 搭建 Nuget 服务器&#xff0c;CentOS,宝塔面板创建容器挂载目录给目录指定写入权限创建并运行 Nuget 服务创建Nuget包项目属性修改包版本号预生成事件执行重新生成手动上传vs菜单命令上传 记得上传在前修改版本号添加外部工具添加自定义命令项目文件夹下面新建 push.cm…