CMake笔记之CMAKE_INSTALL_PREFIX详解以及ROS中可执行文件为什么会在devel_lib中

2024-06-24 08:04

本文主要是介绍CMake笔记之CMAKE_INSTALL_PREFIX详解以及ROS中可执行文件为什么会在devel_lib中,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

CMake笔记之CMAKE_INSTALL_PREFIX详解以及ROS中可执行文件为什么会在devel_lib中

在这里插入图片描述

code review!

文章目录

  • CMake笔记之CMAKE_INSTALL_PREFIX详解以及ROS中可执行文件为什么会在devel_lib中
    • 1.`CMAKE_INSTALL_PREFIX`详解
      • 变量作用
      • 设置 `CMAKE_INSTALL_PREFIX`
      • 示例
      • 影响范围
      • 常见用法
      • 特别注意
      • 总结
    • 2.为什么我可以在这里找到我的可执行文件:devel/lib/ros_templete_pub/ros_templete_pub
      • 构建目录结构
      • 安装目录结构
      • 流程解释
      • 总结

1.CMAKE_INSTALL_PREFIX详解

CMAKE_INSTALL_PREFIX 是 CMake 中的一个重要变量,它定义了安装路径的前缀,决定了项目安装目录的根位置。理解和正确使用 CMAKE_INSTALL_PREFIX 对于控制软件包的安装位置非常重要,特别是在多项目构建和部署环境中。

变量作用

CMAKE_INSTALL_PREFIX 决定了 make installcmake --install 命令将项目文件安装到哪个根目录。默认情况下,它的值通常是 /usr/local,但可以根据需要进行修改。

设置 CMAKE_INSTALL_PREFIX

可以在运行 cmake 命令时通过命令行参数设置 CMAKE_INSTALL_PREFIX,例如:

cmake -DCMAKE_INSTALL_PREFIX=/desired/install/path ..

或者在 CMakeLists.txt 中设置:

set(CMAKE_INSTALL_PREFIX "/desired/install/path" CACHE PATH "Install path prefix")

示例

假设有一个简单的 CMake 项目:

cmake_minimum_required(VERSION 3.0)
project(MyProject)add_executable(my_executable main.cpp)install(TARGETS my_executableRUNTIME DESTINATION bin)

如果运行以下命令:

cmake -DCMAKE_INSTALL_PREFIX=/home/user/myproject_install ..
make
make install

那么 my_executable 会被安装到 /home/user/myproject_install/bin 目录中。

影响范围

CMAKE_INSTALL_PREFIX 影响所有相对路径的安装目标。例如,以下 CMake 语句:

install(TARGETS my_executable RUNTIME DESTINATION bin)

结合 CMAKE_INSTALL_PREFIX,会将 my_executable 安装到 ${CMAKE_INSTALL_PREFIX}/bin 目录。

常见用法

  1. 默认安装路径:

    • 默认值是 /usr/local,适合系统全局安装。
  2. 用户本地安装:

    • 对于没有管理员权限的用户,可以将安装路径设为用户的主目录,例如 ~/myproject_install
    cmake -DCMAKE_INSTALL_PREFIX=~/myproject_install ..
    
  3. 自定义目录:

    • 在构建环境中,可能需要将不同项目安装到特定目录中以避免冲突。
    cmake -DCMAKE_INSTALL_PREFIX=/opt/myproject ..
    

特别注意

  • CMake 缓存: CMAKE_INSTALL_PREFIX 是一个缓存变量,如果修改了它,需要重新配置 CMake 或删除 CMakeCache.txt 文件以确保新值生效。
  • 相对路径: 如果给 CMAKE_INSTALL_PREFIX 赋值相对路径,它会被解释为相对于当前构建目录的路径。通常最好提供绝对路径以避免混淆。

总结

CMAKE_INSTALL_PREFIX 是一个关键变量,用于指定项目的安装根目录。通过正确设置这个变量,可以灵活地控制项目的安装位置,满足不同的部署需求。无论是全局安装、用户本地安装,还是特定目录安装,CMAKE_INSTALL_PREFIX 都能提供强大的支持。

2.为什么我可以在这里找到我的可执行文件:devel/lib/ros_templete_pub/ros_templete_pub

使用

install(TARGETS ros_templete_pubRUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)

在 ROS(机器人操作系统)中,使用 Catkin 构建系统时,构建过程中生成的文件通常会放置在 devel 目录中。这是因为 Catkin 使用了两个主要的构建空间:develinstall。下面解释为什么会在 devel/lib/ros_templete_pub/ros_templete_pub 找到可执行文件。

构建目录结构

  • devel 目录:
    • 该目录是开发空间(development space),在这里构建的文件可以直接使用而无需安装。
    • 运行 catkin_makecatkin build 时,生成的可执行文件和其他构建产物会放置在 devel 目录下。
    • devel/lib 目录通常包含构建生成的可执行文件,因为在 ROS 中,lib 目录不仅用于库文件,也用于存放节点的可执行文件。

安装目录结构

  • install 目录:
    • 该目录是安装空间(install space),通过执行 catkin_make installcatkin build --install 生成的文件会被安装到这里。
    • install 目录中的结构由 CMake install 命令决定,例如 install(TARGETS ...) 语句。

流程解释

  1. 构建阶段:

    • 当运行 catkin_makecatkin build 时,CMake 会在 devel 目录中生成所有构建产物。
    • 可执行文件通常会放置在 devel/lib/<package_name>/ 目录中。因此,会在 devel/lib/ros_templete_pub/ros_templete_pub 找到的可执行文件。
  2. 安装阶段:

    • 如果运行 catkin_make installcatkin build --install,CMake 会根据 CMakeLists.txt 中的 install 规则将文件安装到 install 目录中。
    • 例如,使用 install(TARGETS ros_templete_pub RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}) 会将 ros_templete_pub 安装到 ${CMAKE_INSTALL_PREFIX}/bin,即通常为 install/bin/

总结

devel/lib/ros_templete_pub/ros_templete_pub 找到可执行文件是因为:

  • 开发空间: 在构建过程中,Catkin 默认将可执行文件放置在 devel 目录中,以便可以立即运行和测试这些文件,而无需执行安装步骤。
  • 目录结构: devel/lib/<package_name>/ 是 Catkin 默认的可执行文件输出路径。

如果需要将可执行文件安装到其他位置,请使用 catkin_make installcatkin build --install,并确保在的 CMakeLists.txt 中正确配置了 install 命令。

这篇关于CMake笔记之CMAKE_INSTALL_PREFIX详解以及ROS中可执行文件为什么会在devel_lib中的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1089574

相关文章

Tolua使用笔记(上)

目录   1.准备工作 2.运行例子 01.HelloWorld:在C#中,创建和销毁Lua虚拟机 和 简单调用。 02.ScriptsFromFile:在C#中,对一个lua文件的执行调用 03.CallLuaFunction:在C#中,对lua函数的操作 04.AccessingLuaVariables:在C#中,对lua变量的操作 05.LuaCoroutine:在Lua中,

AssetBundle学习笔记

AssetBundle是unity自定义的资源格式,通过调用引擎的资源打包接口对资源进行打包成.assetbundle格式的资源包。本文介绍了AssetBundle的生成,使用,加载,卸载以及Unity资源更新的一个基本步骤。 目录 1.定义: 2.AssetBundle的生成: 1)设置AssetBundle包的属性——通过编辑器界面 补充:分组策略 2)调用引擎接口API

《offer来了》第二章学习笔记

1.集合 Java四种集合:List、Queue、Set和Map 1.1.List:可重复 有序的Collection ArrayList: 基于数组实现,增删慢,查询快,线程不安全 Vector: 基于数组实现,增删慢,查询快,线程安全 LinkedList: 基于双向链实现,增删快,查询慢,线程不安全 1.2.Queue:队列 ArrayBlockingQueue:

十四、观察者模式与访问者模式详解

21.观察者模式 21.1.课程目标 1、 掌握观察者模式和访问者模式的应用场景。 2、 掌握观察者模式在具体业务场景中的应用。 3、 了解访问者模式的双分派。 4、 观察者模式和访问者模式的优、缺点。 21.2.内容定位 1、 有 Swing开发经验的人群更容易理解观察者模式。 2、 访问者模式被称为最复杂的设计模式。 21.3.观察者模式 观 察 者 模 式 ( Obser

【操作系统】信号Signal超详解|捕捉函数

🔥博客主页: 我要成为C++领域大神🎥系列专栏:【C++核心编程】 【计算机网络】 【Linux编程】 【操作系统】 ❤️感谢大家点赞👍收藏⭐评论✍️ 本博客致力于知识分享,与更多的人进行学习交流 ​ 如何触发信号 信号是Linux下的经典技术,一般操作系统利用信号杀死违规进程,典型进程干预手段,信号除了杀死进程外也可以挂起进程 kill -l 查看系统支持的信号

ROS话题通信流程自定义数据格式

ROS话题通信流程自定义数据格式 需求流程实现步骤定义msg文件编辑配置文件编译 在 ROS 通信协议中,数据载体是一个较为重要组成部分,ROS 中通过 std_msgs 封装了一些原生的数据类型,比如:String、Int32、Int64、Char、Bool、Empty… 但是,这些数据一般只包含一个 data 字段,结构的单一意味着功能上的局限性,当传输一些复杂的数据,比如:

Jitter Injection详解

一、定义与作用 Jitter Injection,即抖动注入,是一种在通信系统中人为地添加抖动的技术。该技术通过在发送端对数据包进行延迟和抖动调整,以实现对整个通信系统的时延和抖动的控制。其主要作用包括: 改善传输质量:通过调整数据包的时延和抖动,可以有效地降低误码率,提高数据传输的可靠性。均衡网络负载:通过对不同的数据流进行不同程度的抖动注入,可以实现网络资源的合理分配,提高整体传输效率。增

操作系统实训复习笔记(1)

目录 Linux vi/vim编辑器(简单) (1)vi/vim基本用法。 (2)vi/vim基础操作。 进程基础操作(简单) (1)fork()函数。 写文件系统函数(中等) ​编辑 (1)C语言读取文件。 (2)C语言写入文件。 1、write()函数。  读文件系统函数(简单) (1)read()函数。 作者本人的操作系统实训复习笔记 Linux

Steam邮件推送内容有哪些?配置教程详解!

Steam邮件推送功能是否安全?如何个性化邮件推送内容? Steam作为全球最大的数字游戏分发平台之一,不仅提供了海量的游戏资源,还通过邮件推送为用户提供最新的游戏信息、促销活动和个性化推荐。AokSend将详细介绍Steam邮件推送的主要内容。 Steam邮件推送:促销优惠 每当平台举办大型促销活动,如夏季促销、冬季促销、黑色星期五等,用户都会收到邮件通知。这些邮件详细列出了打折游戏、

探索Elastic Search:强大的开源搜索引擎,详解及使用

🎬 鸽芷咕:个人主页  🔥 个人专栏: 《C++干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 引入 全文搜索属于最常见的需求,开源的 Elasticsearch (以下简称 Elastic)是目前全文搜索引擎的首选,相信大家多多少少的都听说过它。它可以快速地储存、搜索和分析海量数据。就连维基百科、Stack Overflow、