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_executable
        RUNTIME 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_pub
  RUNTIME 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 命令。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

maya模型仓鼠制作

小仓鼠建模&#xff08;6&#xff09;_哔哩哔哩_bilibili 20240623作品---个人评价&#xff1a;第一次做的&#xff0c;虽然有点丑&#xff0c;但是还能看&#xff01;希望后面有些进步

第10章 启动过程组 (识别干系人)

第10章 启动过程组 10.2识别干系人&#xff0c;在第三版教材第361~362页&#xff1b; 文字图片音频方式 视频13 第一个知识点&#xff1a;主要工具与技术 1、数据收集 问卷调查 包括一对一调查、焦点小组讨论&#xff0c;或其他大规模信息收集技术 头脑风暴 头脑风暴&#xff…

章十九、JavaVUE —— 框架、指令、声明周期、Vue-cli、组件路由、Element

目录 一、 框架 ● vue.js 框架 ● 特点 ● Vue 安装 二、 第一个vue程序 ● 创建项目 ​编辑 ● 导入 vue.js ● 创建vue对象&#xff0c;设置属性&#xff0c;使用模版渲染到页面 介绍 — Vue.js (vuejs.org) 三、 vue指令 ● v-text ● v-html ● v-…

5个wordpress成品站主题

Sora索啦高端制造业wordpress主题 红色高端制造业wordpress主题&#xff0c;适合外贸企业出海建独立站的wordpress模板。 https://www.jianzhanpress.com/?p5885 Polar钋啦wordpress外贸主题 制造业wordpress网站模板&#xff0c;适合生产制造企业官方网站使用的wordpress外…

产品体验周刊第1期(2024-6-24)

产品体验 微信公众号改版 微信公众号文章底部改版&#xff0c;原“点赞”“再看”相关的读者互动模块固定底部栏。作者内容与读者反馈本就是一起组成内容的必要元素&#xff0c;相比较于抖音、小红书&#xff0c;微信公众号的改版可能来的稍微晚了一点。 微信输入法 平常发微…

Linux根目录挂载点(/dev/mapper/centos-root)扩容

如果我们在安装系统是采用自定义分区的话&#xff0c;就可以提前规划好这个事情。但是如果平常没注意就直接采用默认安装的方式的话。一旦 根目录的容量耗尽&#xff0c;将会影响业务的运行。今天我们来扩容逻辑卷。 默认安装的话会给home目录分比较多的空间&#xff0c;我们可…

浅析缓存技术

缓存技术的原理 缓存技术通过在内存中存储数据副本来加速数据访问。当应用程序需要数据时&#xff0c;首先检查缓存是否存在数据副本&#xff0c;如果有则直接返回&#xff0c;否则再从原始数据源获取。这种机制大大减少了访问时间&#xff0c;提升了系统的响应速度和整体性能。…

家政预约小程序14权限配置

目录 1 创建用户2 创建角色3 启用登录4 实现退出总结 我们现在小程序端的功能基本开发好了&#xff0c;小程序开发好之后需要给运营人员提供管理后台&#xff0c;要分配账号、配置权限&#xff0c;我们本篇就介绍一下权限如何分配。 1 创建用户 在微搭中&#xff0c;用户分为内…

使用Fiddler如何创造大量数据!

1、找到评论提交接口 找到我们的评论 2、构造数据 怎么再次发送呢&#xff1f; 这里发送了4次 我们创造了4条数据&#xff0c;我们再去评论区瞅瞅 3、如何解决图片显示问题&#xff1f; 手机端-设置-Wlan-高级-网址不适用代理&#xff0c;将不需要图片的域名加入 4、不抓包的…

MySQL锁、加锁机制(超详细)—— 锁分类、全局锁、共享锁、排他锁;表锁、元数据锁、意向锁;行锁、间隙锁、临键锁;乐观锁、悲观锁

文章目录 一、概述1.1 MySQL锁的由来1.2 锁定义1.3 锁分类 二、共享锁与排他锁2.1 共享锁&#xff08;S锁&#xff09;2.2 排他锁&#xff08;X锁&#xff09;2.3 MySQL锁的释放 三、全局锁3.1 介绍3.2 语法3.3 特点 四、表级锁4.1 介绍4.2 表锁4.3 元数据锁&#xff08;Meta D…

SpringUtils.getBean 空指针异常问题

因为这个项目license问题无法开源&#xff0c;更多技术支持与服务请加入我的知识星球。 今天在新的jeecg-boot里加入下面的代码 /*** 部门经理处理类** author nbacheng* date 2023-08-06*/ AllArgsConstructor Component("DepManagerHandler") DependsOn({"Sp…

基于SSM+Jsp的校园餐厅管理

开发语言&#xff1a;Java框架&#xff1a;ssm技术&#xff1a;JSPJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包…

Ftrans文件安全传输系统 无缝替代FTP实现安全可靠传输

文件安全传输系统是专门设计用来确保文件在传输过程中安全性的软件或服务&#xff0c;现在这类产品很多都被用于替代FTP。 替代FTP的需求主要源于FTP在安全性、效率和功能方面存在一些限制和不足。下面是FTP的优势和劣势的概述&#xff1a; FTP的优势&#xff1a; 普及性和广…

[Centos7] 部署Zabbix5.0

目录 0 卸载 Zabbix1 准备工作1.1 关闭防火墙1.2 关闭SELinux1.3 重启服务器1.4 安装MySQL 2 配置 Zabbix yum 源2.1 安装zabbix的软件仓库配置包2.2 安装 Software Collections 仓库2.3 修改 Zabbix 仓库配置文件 3 安装 Zabbix3.1 遇到报错Requires: libmysqlclient.so.183.2…

图片在线加水印工具,快速将图片铺满水印

有些同学为了防止图片未经授权的使用和传播&#xff0c;想要将图片添加铺满水印&#xff0c;但是不知道如何操作。下面小编就来和大家分享如何使用图片在线加水印工具&#xff0c;快速的将图片铺满水印。 有许多在线工具可以帮助我们快速、高效地给图片添加水印。在线添加水印&…

使用SpringBootTest测试项目

当我们开发项目后&#xff0c;通常需要进行单元测试&#xff0c;确保开发符合预期。但是对于Springboot项目&#xff0c;依赖部分IOC容器对象的注入。比如代码中存在Autowired、Service、Mapper等。 1、确保pom.xml中包含了依赖&#xff0c;其中的version和scope&#xff0c;大…

面向遥感图像的小目标检测最新方法 FFCA-YOLO

论文简介 在遥感图像中&#xff0c;小目标检测面临着特征表示不足和背景混淆等挑战&#xff0c;特别是当算法需要在有限计算资源的约束下进行实时处理时&#xff0c;对准确性和速度的优化要求尤为严格。为解决这些问题&#xff0c;本文提出了一种高效的目标检测器——特征增强、…

驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接的解决方法

在连接数据库的时候出现了下面图面中的错误&#xff0c;尝试集中方法后终于解决了这个问题。 1.修改驱动程序版本 出现这种错误可能是因为你的驱动程序版本不兼容&#xff0c;我们可以尝试修改版本解决。而我们的驱动程序往往是以依赖的形式导入&#xff0c;因此可以在maven仓…

【Linux 基础】文件与目录管理

1. 文件和目录的基本概念 文件&#xff1a;是数据的集合&#xff0c;可以是文本、图像、视频等。 目录&#xff08;也称为文件夹&#xff09;&#xff1a;是文件和子目录的集合&#xff0c;用于组织文件。 2. 目录和路径 绝对路径&#xff1a;从根目录&#xff08;/&#x…

容器之视角构件的演示

代码&#xff1a; #include <gtk-2.0/gtk/gtk.h> #include <glib-2.0/glib.h> #include <gtk-2.0/gdk/gdkkeysyms.h> #include <stdio.h>int main(int argc, char *argv[]) {gtk_init(&argc, &argv);GtkWidget *window;window gtk_window_ne…