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

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中

CMake笔记之CMAKE_INSTALL_PREFIX详解以及ROS中可执行文件为什么会在devel_lib中 code review! 文章目录 CMake笔记之CMAKE_INSTALL_PREFIX详解以及ROS中可执行文件为什么会在devel_lib中1.CMAKE_INSTALL_PREFIX详解变量作用设置 CMAKE_INSTALL_PREFIX示例影响范围常见用法特别…...

数据结构之二叉树的超详细讲解(3)--(二叉树的遍历和操作)

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 数据结构之二叉树的超详细讲解(3)--(二叉树的遍历和操作) 收录于专栏【数据结构初阶】 本专栏旨在分享学习数据结构学习的一点学习笔记&#xff0c;欢迎大家在评…...

Arduino - 旋转编码器 - 伺服电机

Arduino - 旋转编码器 - 伺服电机 Arduino - Rotary Encoder In this tutorial, We are going to learn how to program Arduino to rotate a servo motor according to the rotary encoder’s output value. 在本教程中&#xff0c;我们将学习如何对Arduino进行编程&#xff…...

儿童电动音乐牙刷OTP芯片方案:NV040C,耐温耐压,抗干扰能力强

一&#xff1a;方案背景概述 随着科技的飞速发展&#xff0c;源于对儿童口腔健康深入细致的关怀&#xff0c;以及对现代科技在日常生活用品中应用的不断追求&#xff0c;儿童电动音乐牙刷OTP芯片方案的诞生。 二&#xff1a;芯片简介 NV040C语音芯片是一款性能稳定、适合工厂量…...

Sentinel链路流控模式失效的解决方法

解决方法 1、在pom.xml中增加sentinel-web-servlet的依赖&#xff0c;我使用的版本是1.7.1 <dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-web-servlet</artifactId> </dependency>2、在项目中添加一个FilterCon…...

Web应用安全测试-专项漏洞(一)

Web应用安全测试-专项漏洞&#xff08;一&#xff09; 专项漏洞部分注重测试方法论&#xff0c;每个专项仅列举一个例子。实际测试过程中&#xff0c;需视情况而定。 文章目录 Web应用安全测试-专项漏洞&#xff08;一&#xff09;Web组件&#xff08;SSL/WebDAV&#xff09;漏…...

VMware ESXi 8.0U2c macOS Unlocker OEM BIOS Huawei (华为) FusionServer 定制版

VMware ESXi 8.0U2c macOS Unlocker & OEM BIOS Huawei (华为) FusionServer 定制版 ESXi 8.0U2 标准版&#xff0c;Dell (戴尔)、HPE (慧与)、Lenovo (联想)、Inspur (浪潮)、Cisco (思科)、Hitachi (日立)、Fujitsu (富士通)、NEC (日电)、Huawei (华为)、xFusion (超聚…...

python中的高阶函数介绍

在Python中&#xff0c;高阶函数是指那些可以接受函数作为参数或者返回函数作为结果的函数。这种特性使得函数式编程成为可能&#xff0c;并且可以编写出更加简洁和灵活的代码。以下是Python中一些常用的高阶函数&#xff1a; map() map() 函数接受一个函数和一个可迭代对象作为…...

华为OD机试 - 石头剪刀布游戏(Java 2024 D卷 200分)

华为OD机试 2024D卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;D卷C卷A卷B卷&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;每一题都有详细的答题思路、详细的代码注释、样例测…...

[开发|java] LocalDate转化为LocalDateTime

要将 java.time.LocalDate 转换为 java.time.LocalDateTime&#xff0c;你需要指定一天中的时间。因为 LocalDate 只包含日期部分&#xff08;年、月、日&#xff09;&#xff0c;而 LocalDateTime 包含日期和时间&#xff08;时、分、秒、纳秒&#xff09;&#xff0c;所以在转…...

介绍几种 MySQL 官方高可用方案

前言&#xff1a; MySQL 官方提供了多种高可用部署方案&#xff0c;从最基础的主从复制到组复制再到 InnoDB Cluster 等等。本篇文章以 MySQL 8.0 版本为准&#xff0c;介绍下不同高可用方案架构原理及使用场景。 1.MySQL Replication MySQL Replication 是官方提供的主从同…...

IMU坐标系与自定义坐标系转化

1.首先示例图为例&#xff1a; 虚线黑色角度为IMU的坐标系&#xff1b;实线为自定义坐标系&#xff1b; 矫正&#xff1a;&#xff08;默认angleyaw为IMU采的数据角度&#xff09; angleyaw_pt angleyaw-25;if(-180<angleyaw&&angleyaw<-155) // 角度跳变问…...

《STM32 HAL库》RCC 相关系列函数详尽解析—— HAL_RCC_OscConfig()

观前提示&#xff1a;函数完整代码在文末&#xff0c;本文梳理了函数HAL_RCC_OscConfig()的主要逻辑和实现方法f105时钟树详解图 HAL_RCC_OscConfig() 函数介绍&#xff1a; 此函数是一个用于初始化RCC&#xff08;Reset and Clock Control&#xff09;振荡器&#xff08;Osc…...

手动将jar包导入本地Maven仓库

1、进入存放jar包的目录&#xff0c;可以先放进仓库底下 2、cmd回车 3、执行命令&#xff0c;看到BUILD SUCCESS就是成功了 -DgroupId、-DartifactId、-Dversion、-Dfile记得换成自己对应的 mvn install:install-file -DgroupIdcom.github.03 -DartifactIdonvif -Dversion1.0…...

煤安防爆手机为什么能在煤矿井下使用

煤安防爆手机之所以能在煤矿井下使用&#xff0c;是因为它们经过特殊设计&#xff0c;符合严格的防爆安全标准&#xff0c;能够防止电火花引发爆炸&#xff0c;同时具备防尘防水、抗冲击等特性&#xff0c;确保在恶劣的煤矿环境中稳定可靠地运行&#xff0c;为工作人员提供安全…...

科普小课堂|不同版本USB接口详细解析

USB接口凭借其广泛的兼容性和高性能&#xff0c;已成为连接多样外设的主要接口&#xff0c;囊括了日常的键盘、鼠标等输入设备以及其他更多的领域。不仅如此&#xff0c;USB还展现了高度灵活性&#xff0c;能够便捷地转换为其他总线接口&#xff0c;例如实现USB到以太网或USB到…...

Spring Boot中的JSON解析优化

Spring Boot中的JSON解析优化 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们将探讨在Spring Boot应用中如何优化JSON解析&#xff0c;以提升系统的性能…...

全彩屏负氧离子监测站

TH-FZ5在追求绿色生态、健康出行的今天&#xff0c;景区不仅仅是人们休闲游玩的好去处&#xff0c;更是人们体验大自然、感受清新空气的重要场所。为了进一步提升游客的游览体验&#xff0c;许多景区纷纷引入了全彩屏负氧离子监测站&#xff0c;这一创新举措不仅为景区增添了科…...

LeetCode 1207.独一无二的数

题目要求 给你一个整数数组 arr&#xff0c;请你帮忙统计数组中每个数的出现次数。如果每个数的出现次数都是独一无二的&#xff0c;就返回 true&#xff1b;否则返回 false。示例 1&#xff1a;输入&#xff1a;arr [1,2,2,1,1,3] 输出&#xff1a;true 解释&#xff1a;在该…...

自然语言处理——英文文本预处理

高质量数据的重要性 数据的质量直接影响模型的性能和准确性。高质量的数据可以显著提升模型的学习效果&#xff0c;帮助模型更准确地识别模式、进行预测和决策。具体原因包括以下几点&#xff1a; 噪音减少&#xff1a;高质量的数据经过清理&#xff0c;减少了无关或错误信息…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:

一、属性动画概述NETX 作用&#xff1a;实现组件通用属性的渐变过渡效果&#xff0c;提升用户体验。支持属性&#xff1a;width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项&#xff1a; 布局类属性&#xff08;如宽高&#xff09;变化时&#…...

mongodb源码分析session执行handleRequest命令find过程

mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程&#xff0c;并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令&#xff0c;把数据流转换成Message&#xff0c;状态转变流程是&#xff1a;State::Created 》 St…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?

在建筑行业&#xff0c;项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升&#xff0c;传统的管理模式已经难以满足现代工程的需求。过去&#xff0c;许多企业依赖手工记录、口头沟通和分散的信息管理&#xff0c;导致效率低下、成本失控、风险频发。例如&#…...

蓝桥杯 2024 15届国赛 A组 儿童节快乐

P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡&#xff0c;轻快的音乐在耳边持续回荡&#xff0c;小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下&#xff0c;六一来了。 今天是六一儿童节&#xff0c;小蓝老师为了让大家在节…...

Qt Http Server模块功能及架构

Qt Http Server 是 Qt 6.0 中引入的一个新模块&#xff0c;它提供了一个轻量级的 HTTP 服务器实现&#xff0c;主要用于构建基于 HTTP 的应用程序和服务。 功能介绍&#xff1a; 主要功能 HTTP服务器功能&#xff1a; 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

PL0语法,分析器实现!

简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...

ardupilot 开发环境eclipse 中import 缺少C++

目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中&#xff0c;UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...

服务器--宝塔命令

一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行&#xff01; sudo su - 1. CentOS 系统&#xff1a; yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...