cmakelists.txt文件解析

CMake 3.28 实战:从单文件到多模块项目,5个CMakeLists.txt模板解析 本文详细解析了CMake 3.28在单文件到多模块项目中的5种CMakeLists.txt模板配置实践。从极简单文件项目到复杂多库依赖管理,涵盖跨平台编译和现代依赖管理方案,帮助开发者高效构建C++项目。特别推荐使用CMake 3.28新特性如`CONFIGURE_DEPENDS`和`$<PLATFORM_ID>`实现更优雅的工程配置。 阅读详情

文件CMakeLists.txt是CMake构建系统的输入,用于构建软件包。 任何兼容CMake的软件包都包含一个或多个CMakeLists.txt文件,这些文件描述了如何构建代码以及将代码安装到何处。 用于柳絮项目的CMakeLists.txt文件是标准的香草CMakeLists.txt文件,带有一些其他约束。

您的CMakeLists.txt文件必须遵循此格式,否则您的软件包将无法正确构建。 配置中的顺序不计算在内。

Required CMake Version (cmake_minimum_required)

Package Name (project())

Find other CMake/Catkin packages needed for build (find_package())

Enable Python module support (catkin_python_setup())

Message/Service/Action Generators (add_message_files(), add_service_files(), add_action_files())

Invoke message/service/action generation (generate_messages())

Specify package build info export (catkin_package())

Libraries/Executables to build (add_library()/add_executable()/target_link_libraries())

Tests to build (catkin_add_gtest())

Install rules (install())

常用变量

  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:重新定义目标链接库文件的存放位置

  2. 环境变量
    使用环境变量

$ENV{Name}
写入环境变量

set(ENV{Name} value) # 这里没有“$”符号
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

细节

  1. makefile是有条理的gcc编译命令文件.利用make工具来执行Makefile的编译指令.一般利用cmake和autotools来自动生成cmake.

  2. cmake用来读取Cmakelists.txt文件语句,最终生成Makefile文件.

当定义的target依赖另外一个target,确保在源码编译本target之前其他target已经构建,使用

ADD_DEPENDENCIES

说白了要说明白先编译谁再编译谁

  1. INSTALL用于定义安装规则,安装的内容包括,目标二进制,动态库,静态库,文件,目录,脚本等.

  2. 静态库:在链接其他目标时候使用;动态库:运行时候加载

这两种库都发生在链接阶段:

(1)静态库,库中目标文件的所有将被程序使用的函数的机械码,被copy到最终可执行文件中;移植方便,运行效率高但占用内存空间大.对程序更新不太好.

(2)动态库:在程序运行时才被载入.可执行文件只是包含了它所需要函数的引用表,而不是函数代码.只有当程序执行的时候,那些需要的代码才会被拷贝到内存中.因为是在程序运行的时候被载入的,所有解决了静态库对程序的更新,部署和发布带来的麻烦.进程之间资源共享.但是依赖性强.(牺牲时间换取空间效率)

  1. 链接内部库

生成共享库,给自己和给别人用都很方便.

LIBRARY_OUTPUT_PATH 设置库文件输出路径

  1. 添加外部链接库

链接库导入的是,头文件和库文件. 顺序先头文件导入再库文件链接

导入库文件的几点尝试:
(1)利用绝对路径导入

(2)利用install导入 CMAKE_INSTALL_PREFIX 设置安装路径,安装库的位置,再分别导入库的头文件和库文件

(3)利用find_package的方式导入;camke要手动配置,有模块模式和配置模式.指令按照优先级在指定路径查找Findxxx.cmake和xxxConfig.cmake.

cmake能找到其中一个就能成功使用库

<NAME>_FONDif(<NAME>_FOND)找到库的标志
<NAME>_INCLUDE_DIR or <NAME> _INCLUDESfind_path(<NAME>_INCLUDES)库的头文件路径
<NAME> _LIBRARY <NAME> _LIBSfind_library(<NAME>_LIBS)库文件路径

REQUIRED选项,如果没有找到包的配置文件,Cmake将停止编译并且产生错误

QUIET选项,如果没有找到包的配置文件,Cmake会产生一个warning

  1. catkin_package() 放到里面说明供外部使用 catkin是工具,catkin包

  2. 外部使用特别简单,直接在.xml中<depend>lib </depend>

  3. 当我们使用CMake find_package(...)命令roscpp作为参数时一样,我们不仅将获得的构建标志 roscpp,而且还将获得其依赖项的所有标志。这大大简化了将依赖项合并到我们的程序中的过程。pkg-config但是与find_package(...)命令不同,该命令查找CMake配置文件,该文件包含与Pkg-Config .pc文件在语义上相同的信息。也与Pkg-Config不同,此CMake命令不是特定于平台的。

  4. 运行find_package(roscpp),自动定义了几个CMake的变量,包括但不限于${roscpp_INCLUDE_DIRS}, ${roscpp_LIBRARY_DIRS}和${roscpp_LIBRARIES}。这些变量遵循许多CMake配置文件使用的标准命名约定。然后可以将这些变量传递到标准CMake命令中,如CMakeLists.txt上面的 文件所示。

    此外,通过将可选REQUIRED参数添加到中find_package(...),如果未找到该软件包,CMake将报告人类可读的错误。

    CMake需要知道在哪里可以找到软件包。在一些地方可以进行CMake搜索,但是这些软件包对CMake的暴露方式是通过 $CMAKE_PREFIX_PATH环境变量进行的。对于ROS库,您可以(再次)确保您已经获得/opt/ros/hydro/setup.bash,或者可以显式设置路径

export CMAKE_PREFIX_PATH=/opt/ros/hydro:$CMAKE_PREFIX_PATH
  1. 开始使用Catkin的最简单方法是将教程项目声明为“ catkin程序包”。这是通过catkin_package()CMake函数完成的(在此处进行了记录。catkin通过CMake的标准find_package()机制找到软件包后,该函数才可用.

踩过的坑

launch文件中的<node>元素pkg的值就是cmakelists.txt中project()的值.而不是文件名.

SOEM主站开发篇(5):CMakeLists.txt文件解析 详细介绍了SOEM主站的CMakeLists.txt文件,为后面的SOEM主站开发铺路。 阅读详情

相关推荐

触摸延时灯课程设计

Multisim源文件下载: 实验名称:­­­­­­­­­­­­­­­­­­­ 课程设计1:触摸延时灯仿真设计 设计要求: 利用单稳态触发器设计触控延时灯,要求利用触发波形的边沿模拟触控点实现触发,触发后3秒灯亮,灯可以亮的时间可在5-10秒之间可调。 设计思路: 利用集成单稳态触发器CD4098设计简易的触摸延时灯电路。应用CD4098可以实现脉冲延时,原理图如下。4脚未触发信号输入端,可通过比较器对触摸产生的信号进行比较后再产生触发信号,使触发准确度得以提高。...

m0_54240221的博客 1万+

CMakeLists.txt详解

个人总结

m0_53685032的博客 2万+

VirtualBox虚拟机上ubuntu系统安装问题记:显示画面太小、启动就异常退出等

报错:Failed to load R0 module D:/VMMR0.r0: The path is not clean of leading double slashes: ‘D:/VMMR0.r0’ (VERR_SUPLIB_PATH_NOT_CLEAN).解决方法特别简单,就是安装VIrtualBox的时候不要安装在CDE等盘根目录下。首先VirtualBox的下载安装过程是比较简单的,此处就不赘述了。然后E盘下新建个目录,安装到这个目录下就可解决。

qq_42595610的博客 2825

CMakeLists.txt 文件详解

命令时,指定 CMakeLists.txt 文件的路径,CMake 会读取该文件并根据其中的命令和配置生成相应的构建系统文件(如 Makefile、Visual Studio 解决方案等)。然后,使用生成的构建系统文件进行构建操作。这些只是 CMakeLists.txt 文件中的一些常见命令和配置选项,CMake 提供了更多的功能和灵活性,可以根据项目需求进行进一步的配置和定制。其他命令和配置:CMake 提供了许多其他命令和配置选项,可以根据具体需求进行配置,如设置输出路径、定义宏、配置测试等。

clayhell的博客 5888

IO多路转接 ——— select、poll、epoll

select是系统提供的一个多路转接接口。select函数的函数原型如下: 参数说明:参数timeout的取值:返回值说明:select调用失败时,错误码可能被设置为:fd_set结构与sigset_t结构类似,fd_set本质也是一个位图,用位图中对应的位来表示要监视的文件描述符。 调用select函数之前就需要用fd_set结构定义出对应的文件描述符集,然后将需要监视的文件描述符添加到文件描述符集当中,这个添加的过程本质就是在进行位操作,但是这个位操作不需要用户自己进行,系统提供了一组专门的接口,用

2021dragon的博客 7978

用VFP计算 CRC-16 Modbus 校验位

1. Modbus是一种串行通信协议,最初由Modicon(目前属于施耐德电气公司)于1979年开发2. Modbus协议是应用在Modicon产品上的,后来才被移植到其他产品上3. Modbus协议的通信接口可以有多种选择,如RS232、RS485、以太网等。

lddnzx的博客 518

CMake是什么?有什么用?

CMakeCMake是一个跨平台的编译(Build)工具,可以用简单的语句来描述所有平台的编译过程。CMake能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似UNIX下的automake。假如我们有一个深度学习框架的部分工程列表,里面有超过40个互相调用的工程共同组成,一些用于生成库文件,一些用于实现逻辑功能。他们之间的调用关系复杂而严格,如果我想在这...

The Best or Nothing. 10万+

深度学习实战107-基于Qwen3+GraphRAG+Agent的智能文档管理系统:精准问答与决策支持

在当今信息爆炸的时代,企业面临海量文档的管理与利用挑战。传统文档管理系统虽然提供了存储和检索功能,但缺乏对文档内容的深度理解与分析能力,更难以实现基于知识的决策支持。基于多模态大模型Qwen3、GraphRAG技术与Agent框架构建的智能文档管理系统,能够突破传统限制,实现文档内容的精准解析、知识图谱的自动构建、复杂关系的推理分析以及决策建议的生成,为企业知识管理带来革命性变革。

微学AI的博客 865

Clion文件夹有很多CMakeLists.txt如何只解析一个?

Clion文件夹有很多CMakeLists.txt如何只解析一个? 在CLion中,当您打开包含多个

Kp0fS的草稿纸 937

UCIE Specification详解(三)

Protocol Layer(协议层)以及Die-to-Die Adapter

Crazzy_M的博客 1762

【网络与爬虫 41】TLS指纹伪造技术深度解析:ja3、ja4反检测与绕过策略

TLS指纹是现代反爬虫系统的重要检测手段,通过分析客户端TLS握手特征来识别爬虫。本文将深入解析ja3、ja4等TLS指纹技术原理,详细介绍指纹伪造和绕过策略,通过实际代码示例和工具使用,帮助开发者掌握TLS指纹反检测技术,构建更隐蔽的网络爬虫系统。

熵数实验室 1万+

CMakeLists.txt 文件解析

本文详细解析了QtCreator生成的CMakeLists.txt文件,逐行说明其功能:指定CMake最低版本、定义项目名称与语言、查找Qt6依赖、启用Qt标准配置、创建可执行程序并添加源文件、设置Windows/macOS平台特性、链接Qt核心库、配置安装路径及生成部署脚本。整体结构清晰,涵盖项目构建、依赖管理、跨平台支持与部署自动化,帮助初学者理解Qt+CMake项目的配置逻辑。

MonteC的博客 241

使用Simulink设计并实现一个可调谐的二阶IIR陷波滤波器,实时去除音频中的工频噪声

《基于Simulink的音频陷波滤波器设计与实现》摘要:本文详细介绍了使用Simulink设计陷波滤波器去除音频工频噪声(如50Hz)的方法。核心内容包括:1)二阶IIR陷波滤波器的原理与传递函数;2)Simulink实现步骤(音频系统搭建、滤波器设计、频率跟踪);3)性能分析(频谱对比、时域波形、听觉测试)。通过精准消除特定频率干扰,同时保留语音信号(200Hz-4kHz),有效提升信噪比(>20dB)。文章还探讨了多陷波级联、自适应算法等高级技巧,为音频处理、语音通信等应用提供实用解决方案。

amy_mhd的博客 154

ROS下CMakeLists.txt文件解析

从gcc到make再到cmake以及catkin解析参考make和cmake简要介绍_make cmake-优快云博客catkin是ROS官方自定义的编译系统,它的原理与流程与Cmake很相似,和老版本rosbuild相比,支持更好的可移植性(catkin结合了可移植性好的CMake和python)以及交叉编译。(在ROS2使用的编译工具是ament,它是由catkin优化迭代而来的版本)。知乎 - 安全中心。

gaoziqunde的博客 1155

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

【ROS】CMakeLists.txt文件解析

这就是CMakeLists.txt文件的大部分主要功能的解析,其中还有一个generate_dynamic_reconfigure_options()函数没有说到,这个是根动态参数配置相关的,将会在介绍dynamic reconfigure的文章中说到。

qq_52785580的博客 2185

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

CMakeLists.txt文件解析

CMakeLists.txt: PROJECT(OpenCV_Example) //这是建立一个工程项目(类似于我们VS中建立C++项目一样),括号里面时工程名,工程名我们可以任意给,最后程序编译出来的可执行文件就是这个名字 CMAKE_MINIMUM_REQUIRED(VERSION 2.6)    //这是对CMake工具最低版本要求,这里我们要检查下我们的CMake工具...

share space的博客 794

【Qt】【CMake】-CMakeLists.txt-编译错误:源文件路径配置全解析

本文深入解析Qt项目中使用CMake时常见的编译错误,特别是CMakeLists.txt中的源文件路径配置问题。从基础路径变量解释到实战配置技巧,详细介绍了如何避免'No SOURCES given to target'等错误,并提供了Qt项目特有的资源文件处理方法和跨平台路径处理的最佳实践。

s3t4u的博客 822

sylar高性能服务器框架:CMakeLists.txt文件解析

force_redefine_file_macro_for_sources(targetname) 这个 CMake 函数的主要目的是 重定义源文件中的 _ _ FILE _ _ 宏,使其包含相对于项目根目录的文件路径,而不是默认的绝对路径。是 CMake 中用来创建一个共享库(Shared Library)的命令,具体来说,它创建了一个名为 sylar 的共享库,并将源文件列表 LIB_SRC 中列出的文件编译成这个库。:是之前定义的 CMake 变量,代表最终需要编译成库的源文件列表。

fcopy的博客 893

Qt内CMake文件解析(CMakeLists.txt)

【代码】Qt内CMake文件解析(CMakeLists.txt)

不定期更新,欢迎查阅 1091

别再只source setup.bash了!ROS2项目打包与安装的完整流程解析:从CMakeLists.txt到可执行文件

本文深入解析ROS2项目从CMakeLists.txt配置到可执行文件生成的完整流程,解决常见的'no executable found'报错问题。通过详细讲解colcon、ament和CMake的协作机制,以及install命令的正确使用,帮助开发者实现ROS2项目的工程化部署与系统集成。

weixin_30587927的博客 476

CMakeLists.txt多文件编译与大数组链接问题解析

CMake是跨平台构建系统生成器,而非编译脚本——其核心在于声明项目结构而非编写执行流程。理解add_executable和target_link_libraries的声明式逻辑,是解决多cpp文件未参与链接、符号未定义等常见错误的前提;而大数组导致的‘静默崩溃’,本质是栈空间不足触发的链接器失败,需通过std::vector堆分配或全局变量迁移来规避。这些属于C++工程化构建的基础能力,广泛应用于CLion、VS Code等IDE的CMake项目配置,尤其在嵌入式图像处理、算法Demo等教学与原型开发场景

weixin_28831461的博客 265

PX4 CMakeLists.txt 文件剖析

PX4 CMakeLists.txt 文件剖析 前面对于 PX4 的 Makefile 已经做了比较详细的分析, 这里进一步对 PX4 的 CMakeLists.txt 文件结构进行进一步的分析. 1 CMake 简述 CMake 是一个DSL( Domain Specific Language), 主要用来辅助对代码的编译配置和管理, 其具有跨平台, 可维护性较好的特点, 目前在 C++ 项目中...

lipi37的博客 2539

ROS中CMakeLists.txt文件详解

这篇文章是有关ROS中catkin CMakeLists.txt使用的内容。 CMakeList.txt文件是CMake编译系统编译软件包过程的输入文件。任何CMake兼容包都包含一个或多个CMakeLists.txt文件,这些文件描述了如何编译代码以及将其安装到哪里。将CMakeLists.txt文件应用于一个catkin项目时,它就作为一个标准的附带一些限制条件的vanilla CMakeLists.txt文件。使用CMake编译程序时,cmake指令依据CMakeLists.txt 文件生成makef

weixin_43956732的博客 3818

详细解释一个ros的CMakeLists.txt文件

【代码】详细解释一个CMakeLists.txt文件。

Tipriest的博客 342
上一篇: leetcode之递归详解
下一篇: realsense D435 标定(calibration)
黑猫爱小鹿
博客等级 码龄8年 1万+粉丝 205原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值