ros里Catkin的CMakelists/package.xml

2023-05-16

Catkin是基于CMake的编译构建系统,具有以下特点:
Catkin沿用了包管理的传统像 find_package()基础结构,pkg-config扩展了CMake,例如
软件包编译后无需安装就可使用,自动生成find_package()代码,pkg-config文件,解决了多个软件包构建顺序问题
一个Catkin的软件包(package)必须要包括两个文件:
package.xml:
包括了package的描述信息name, description, version, maintainer(s), license,opt. authors, url’s,dependencies, plugins, etc…
CMakeLists.txt:
构建package所需的CMake文件
调用Catkin的函数/宏
解析package.xml
找到其他依赖的catkin软件包
将本软件包添加到环境变量

package.xml

< name>-包的名字
< version>-包的版本号(格式:xxx.xxx.xxx)
< description>-包的内容描述
< maintainer>-维护包的人员的名字
< license>-软件许可证 (例如GPL,BSD,ASL,TODO)
< author> - 原作者名
< url> - 介绍本package的网站链接
< package format=“2”> 格式2
< buildtool_depend>编译构建工具,构建工具依赖关系指定此软件包需要构建自身的构建系统工具。通常只有catkin;
< build_depend>编译依赖项,构建依赖关系指定构建此包所需的包,如果你只使用一些特定的依赖来构建你的包, 而不是在执行时,你可以使用 <build_depend>标签;
< build_export_depend>指定包构需要哪些包用来build;
< package format=“2”> 格式2
< exec_depend>
运行依赖项,指定运行此包中的代码需要哪些包,或针对此包构建库;
< doc_depend>
文档依赖项;
< depend>
指定依赖项为编译、导出、运行需要的依赖,最常用,可以涵盖上面的
< build_depend>,< build_export_depend>和< exec_depend>;

顺序

  1. 所需的 CMake 版本 (cmake_minimum_required)
  2. 包名 (project())
  3. 将普通、缓存或环境变量设置为定值set(CMAKE_CXX_STANDARD 14)
  4. 查找构建所需的其他 CMake/Catkin 包 (find_package())
  5. 启用 Python 模块支持 (catkin_python_setup())
  6. 消息/服务/动作生成器(add_message_files(), add_service_files(), add_action_files())
  7. 调用消息/服务/操作生成 (generate_messages())
  8. 指定包构建信息导出 (catkin_package())
  9. 指定目标编译时需要的头文件路径 include_directories(< dir1 >, < dir2 >, …, < dirN >)
  10. 要构建的库/可执行文件(add_library()/add_executable()/target_link_libraries())
  11. 要构建的测试 (catkin_add_gtest())
  12. 安装规则(install())

cmake_minimum_required(VERSION 3.10)

定义CMake 版本 (固定要写)
每个 catkin CMakeLists.txt 文件都必须以所需的 CMake 版本开头。
Catkin 需要 2.8.3 或更高版本。现在已经有3.10了
cmake_minimum_required(VERSION 3.10)

project()

CMake项目函数指定包的名称(固定要写)。比如我们正在制作一个名为robots_brain的
project(robot_brain)
在 CMake 中,可以再CMake 脚本中任何需要的地方使用变量${PROJECT_NAME }引用项目名称。

set(CMAKE_CXX_STANDARD 14)

set(CMAKE_CXX_STANDARD 14)
通过为CMAKE_CXX_STANDAND赋值,指定要使用 C/C++ 的什么版本;
set(CMAKE_CXX_STANDARD_REQUIRED ON)
通过为CMAKE_CXX_STANDARD_REQUIRED赋值,设置指定的C++编译器版本是
必须的,如果不设置,或者为OFF,则指定版本不可用时,会使用上一版本;

find_package()

编译一个项目,需要使用CMake 的 find_package函数确定依赖的其他CMake包并找到它们,一般情况下至少会有一个catkin依赖:
find_package(catkin REQUIRED)
除此之外,项目依赖的其他软件包,都会自动成为catkin的组件(components)(就CMake而言)。如果将它们指定为组件,而不是在这些包上使用find_package,它将更简单。例如,如果使用包nodelet
find_package(catkin REQUIRED COMPONENTS nodelet)
如果使用 C++ 和 Boost,需要在 Boost 上调用find_package()并指定您使用 Boost 的哪些部分作为组件。
例如,如果想使用 Boost 线程,便这样写:
find_package(Boost REQUIRED COMPONENTS thread)

1. find_package()做了什么?

如果CMake通过 find_package()查找到一个软件包,它就会创建几个CMake环境变量,以提供有关已查找到的软件包的信息。这些环境变量可以在后面的CMake脚本中使用,它们表示软件包导出的头文件所在的位置、源文件所在的位置、软件包依赖的库以及这些库的查找路径,环境变量的名字遵循_,即包名-属性:

_FOUND:当库被查找到时置为true,否则为false
_INCLUDE_DIRS或_INCLUDES:软件包导出的头文件路径
_LIBRARIES或_LIBS:软件包导出的库的路径
_DEFINITIONS:?

2. 为何将Catkin软件包指定为组件?

Catkin软件包(指的是外部软件包等等)严格意义上并不是catkin的组件,而且,CMake的功能组件功能被用于catkin的设计,以节省大量的打字时间。

对于catkin软件包,以catkin的组件的方式 find_package它们是有好处的,因为这个过程以catkin_prefix的形式创建了一组环境变量。例如,在程序中要使用nodelet软件包,推荐查找软件包的方式是:
find_package(catkin REQUIRED COMPONENTS nodelet)
这就意味着nodelet导出的头文件路径、库等都会附加到 catkin_variables上,比如,catkin_INCLUDE_DIRS不仅包含catkin的头文件路径,也包含了nodelet软件包的头文件路径,这在后面会派上用场。

含有message\service\action的

记住要在catkin_package()前面,cmakelists的注释为#号

  1. find_package()两种写法:
set(ROS_DEPENDENCIES
        roscpp std_msgs
        behaviortree_cpp_v3
        actionlib_msgs
        actionlib
        message_generation
        genmsg
        )

//包含行为树库的路径,同时还包含了创建action 和 service 相关的库
find_package(catkin REQUIRED COMPONENTS
            ${ROS_DEPENDENCIES})
----------------------------------------------------------
find_package(catkin REQUIRED 
			COMPONENTS 
			//含有msg的要添加以下包依赖生成信息
 			message_generation
 			//以下包属于信息的类型,看需要获取
 			//http://wiki.ros.org/genmsg?distro=noetic
 			genmsg
 			std_msgs
 			//含有action要添加以下两个包依赖
 			actionlib_msgs 
 			actionlib
 			)
  1. add_xxx_files(),generation_message()添加相关文件
add_message_files(
        FILES
        BehaviorTree.msg
        NodeParameter.msg
        NodeStatus.msg
        StatusChange.msg
        StatusChangeLog.msg
        TreeNode.msg
)
add_service_files(
        FILES
        do_what.srv
)
add_action_files(
        DIRECTORY action//找不到路径则详细说明存放的目录
        FILES Shoot.action
)
generate_messages(
        DEPENDENCIES
        std_msgs  # Or other packages containing msgs
        genmsg//也可
        actionlib_msgs
)
  1. package.xml文件必须包含一个在message_generation上的编译依赖和一个在message_runtime上的运行时依赖,如果从其他包中传递依赖关系,则这不是必需的。
    <depend>message_generation</depend>
    <depend>std_msgs</depend>
    <depend>geometry_msgs</depend>
    <depend>actionlib</depend>
    <depend>actionlib_msgs</depend>
    <exec_depend>message_runtime</exec_depend>
  1. add_dependencies()
  • 如果有一个目标(甚至是过渡性的)依赖于需要建立消息/服务/动作的其他目标,需要在目标catkin_EXPORTED_TARGETS上添加显式依赖项,以使它们按照正确的顺序编译。这种情况几乎总是适用,除非你的软件包真的不使用ROS的任何部分。不幸的是,这种依赖不能自动传播。(some_target是由add_executable()设置的目标的名字)
    add_dependencies(some_target ${catkin_EXPORTED_TARGETS})
  • 如果有编译消息和/或服务的软件包以及使用这些软件的可执行文件,则需要在自动生成的消息目标上创建明确的依赖关系,以便它们按正确的顺序编译。
    add_dependencies(some_target ${${PROJECT_NAME}_EXPORTED_TARGETS})
  • 如果都满足,则
    add_dependencies(shoot_action_server ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS} ros_behaviortree_demo_gencpp)

catkin_package()

catkin_package()是一个由catkin提供的CMake宏。需要指定特定的catkin信息到编译系统,而这些信息又会被为find_package和pkg-config生成代码和其他CMake文件, 以便其他包可以获取有关此包的信息。
可以说catkin_package()是作用在find_package()中的,它安装 package.xml 文件。
必须在使用add_library()或add_executable()声明任何目标之前调用此函数。该函数有 5 个可选参数:

  • INCLUDE_DIRS (list of strings) : CMAKE_CURRENT_SOURCE_DIR - C/C++ 的相对路径。软件包导出的头文件路径(例如cflags)
  • LIBRARIES(list of strings) : 从项目导出的库 如果逻辑目标名称与安装的名称不同,则会中断此操作。
  • CATKIN_DEPENDS(list of strings) : 当前项目依赖的其他catkin项目,DEPENDS以及CATKIN_DEPEND 告诉 catkin 您的包的哪些依赖项应该传递给find_package
  • DEPENDS(list of strings) : 当前项目依赖的非catkin CMake项目,但为该项目所依赖的 CMake 项目列表。由于它们可能不是find_packagable或缺少 pkg-config 文件,因此它们INCLUDE_DIRS和LIBRARIES被直接传递。这要求它之前已经被find_package -ed。(ROS packages有时会需要操作系统提供一些外部函数库,这些函数库就是所谓的“系统依赖项”)
  • CFG_EXTRAS(strings) : 附加配置选项
catkin_package( INCLUDE_DIRS include  
                LIBRARIES ${PROJECT_NAME}   
                CATKIN_DEPENDS roscpp nodelet   
                DEPENDS eigen opencv)
                
catkin_package(
        INCLUDE_DIRS include
        LIBRARIES ros_behaviortree_demo
        CATKIN_DEPENDS ${ROS_DEPENDENCIES}//find_package已经定义的
        #  DEPENDS system_lib
)

include_directories(< dir1>, < dir2>, …, < dirN>)

include_directories的参数应该是由调用find_package生成的* _INCLUDE_DIRS变量以及需要包含的任何其他目录。如果使用catkin和Boost,include_directories()的调用为:
include_directories(include {Boost_INCLUDE_DIRS} {catkin_INCLUDE_DIRS})
第一个参数“include”表示包中的include/目录也是路径的一部分。

add_library()/add_executable()/target_link_libraries()

  • 要指定必须编译的可执行目标,必须使用CMake函数 add_executable()。声明想要的可执行文件的文件名,以此生成此可执行文件所需的源文件列表,如果有多个源文件,用空格区分开。例如:
    add_executable(myProgram src/main.cpp src/some_file.cpp src/another_file.cpp)
  • 该命令会编译名为 myProgram的可执行文件,它是由后面的三个源文件共同编译生成的。
    CMake函数 add_library()指定用于编译的库文件,默认情况下,catkin编译共享库。
    add_library({PROJECT_NAME} {${PROJECT_NAME}_SRCS})
  • 使用 target_link_libraries()函数指定可执行目标所要链接的库,即告诉CMake当链接此可执行文件时需要链接哪些库(这些库在上面的find_package中定义),通常在调用完add_executable()后被调用。如果出现ros未定义的引用错误,则添加** ${catkin_LIBRARIES}**。
    语法:
    target_link_libraries(, , , … )
  • 例子:
//将 foo与libmoo.so链接起来
add_executable(foo src/foo.cpp)
add_library(moo src/moo.cpp)
target_link_libraries(foo moo)

//else
add_library(rm_common SHARED ${sources} include/rm_common/referee/data.h)
add_executable(test_kalman test/test_kalman_filter.cpp)
target_link_libraries(rm_common ${catkin_LIBRARIES})
target_link_libraries(test_kalman rm_common ${catkin_LIBRARIES})

注意,在大多数使用情况下,没有必要使用link_directories(),因为该信息通过find_package()已经自动提取到了。

install()

编译完成后,目标被放入catkin工作空间下的devel目录。一般希望将目标安装到系统上,以使其他用户使用,或者安装到本地目录来测试系统级别的安装。也就是说,如果希望能够对代码进行make install,就需要明确目标结束的位置。
上述过程可以使用CMake的 install()函数实现,该函数的参数有:
TARGETS:要安装的目标
ARCHIVE DESTINATION:静态库和动态链接库DLL(Windows).lib存根
LIBRARY DESTINATION:非DLL共享库和模块
RUNTIME DESTINATION:可执行目标和DLL(Windows)模式共享库
例子:

install(TARGETS ${PROJECT_NAME}  
        ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}  
        LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}  
        RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION})

除了这些标准的目标,还要安装一些文件到特定的目录下,即一个包含Python绑定的库必须要安装到另外的不同的目录下,这对Python是重要的:

install(TARGETS python_module_library  
        ARCHIVE DESTINATION ${CATKIN_PACKAGE_PYTHON_DESTINATION}  
        LIBRARY DESTINATION ${CATKIN_PACKAGE_PYTHON_DESTINATION})
  • 安装Python可执行脚本
    Python代码的安装规则有些不同,它不需要使用 add_library()和add_executable()函数来告知CMake哪个文件是目标文件、目标文件是什么类型的。而是使用如下的CMakeList.txt文件:
catkin_install_python(PROGRAMS scripts/myscript  
                      DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION})

如果只是安装了Python的脚本,不提供任何模块的话,就不用创建上文提到的 setup.py文件,也不用调用catkin_python_setup()。

  • 安装头文件
    头文件必须安装到include目录下,这通常通过安装整个文件夹的文件来完成(可以根据文件名模式进行过滤,并排除SVN子文件夹)。可以通过一下安装规则实现:
install(DIRECTORY include/${PROJECT_NAME}/  
        DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION}  
        PATTERN ".svn" EXCLUDE)

或者如果include目录下的子文件夹无法和软件包名匹配时:

install(DIRECTORY include/  
        DESTINATION ${CATKIN_GLOBAL_INCLUDE_DESTINATION}  
        PATTERN ".svn" EXCLUDE)
  • 安装roslaunch文件或其他源
    其他像launchfiles的资源可以安装到 ${CATKIN_PACKAGE_SHARE_DESTINATION}:
install(DIRECTORY launch/  
        DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}/launch  
        PATTERN ".svn" EXCLUDE)

参考连接:
来自知乎
来自廖总
优秀的相关文章

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ros里Catkin的CMakelists/package.xml 的相关文章

  • 如何在 Golang 中将 []byte XML 转换为 JSON 输出

    有没有办法在 Golang 中将 XML byte 转换为 JSON 输出 我有以下功能body is byte但我想在一些操作之后将此 XML 响应转换为 JSON 我试过了Unmarshal in xml打包没有成功 POST func
  • 在 C# 中使用(IDisposable obj = new ...) 在流中写入代码块(例如 XML)

    我已经开始使用实现 IDisposable 的类通过 using 语句在流中写入块 这有助于保持正确的嵌套并避免丢失或错误放置开始 结束部件 基本上 构造函数写入块的开头 例如打开 XML 标签 Dispose 写入结束 例如关闭 XML
  • 获取对 SOAP 的 XML 响应中的节点值

    我在 PowerShell 中发出 SOAP 请求 如下所示 uri https secure echosign com services EchoSignDocumentService20 WSDL sun Invoke WebReque
  • 我无法下载 R 中的 reshape2 包 [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我在尝试安装 R 包时收到此响应 gt installed packages reshape2 Package LibPath V
  • 将 github 上的包安装到 Spyder 中

    我一直在尝试安装并导入mpl finance来自 github 的包 在我的 Spyder 环境中没有成功 我努力了 pip install e git https github com matplotlib mpl finance git
  • 扩展 XSD 文件

    我有一个带有枚举类型的 XSD 文件 我想创建一个 扩展 XSD 文件 它添加一些额外的枚举 但其他方面的行为就像主 XSD 一样 例如 主 XSD 文件包含以下内容
  • 按钮 - 单击时更改背景颜色

    我的活动中有 8 个按钮 我正在寻找的是 按钮具有默认背景 单击按钮时 背景颜色应更改为其他颜色 这部分非常简单 但是 当我单击任何其他按钮时 第一个按钮的背景颜色应该变回默认颜色 我知道这将使用 选择器状态 来完成 但我不太确定如何实现它
  • 我可以创建自定义 java.* 包吗?

    我可以创建一个与预定义包同名的自己的包吗在Java中 比如java lang 如果是这样 结果会怎样 这难道不能让我访问该包的受保护的成员 如果不是 是什么阻止我这样做 No java lang被禁止 安全管理器不允许 自定义 类java
  • 使用“save”方法更改 ado 对象的 xml 导出字段的精度

    我正在开发一个 VB6 应用程序 该应用程序使用 ADODB Recordset 对象通过 save 方法将数据转储到 xml 文件 如下所示 adoRecordset Save strDst adPersistXML 其中 strDst
  • XML 解析:格式良好的检查:未声明的实体

    我正在使用 SSMS 2008 但收到以下错误 你知道这意味着什么吗 Msg 9448 Level 16 State 1 Line 4 XML parsing line 1 character 89 well formed check un
  • 禁止的软件包名称:java

    我尝试从数据库名称为 jaane 用户名 Hello 和密码 hello 获取数据 错误 java lang SecurityException Prohibited package name java at java lang Class
  • 在activity_main.xml中注释

    我是安卓新手 据我所知 XML 中的注释与 HTML 中的注释相同 使用 形式 我想在 Android 项目的 Activity main xml 配置文件中写一些注释 但它给了我错误 值得注意的是 我使用的是 Eclipse 但目前 我直
  • 最好的 php DOM 2 数组函数是什么?

    我想解析xml文件 到目前为止 我发现最好的方法是使用 DOMDocument 类 示例 xml 字符串
  • 在Excel VBA中将图像(jpg)转换为base64?

    我需要在 Excel 中转换图像 或通过VBA 转为base64 最后我将进行XML输出 我怎样才能做到这一点 我需要引用 DOM 吗 我一直在读书这个问题 https stackoverflow com questions 169907
  • python下安装xgboost 32位msys失败

    尝试安装 xgboost 失败 Windows 和企业版版本为 Anaconda 2 1 0 64 位 我该如何继续 我一直在使用 R 似乎从 RStudio 在 R 中安装新包相当容易 但在间谍程序中则不然 因为我需要进入命令窗口来执行此
  • XML 渲染错误 Android 预览 N

    更新后我已将 android SDK 更新为 android Preview N 但收到此 xml 渲染错误 单击详细信息后 它显示以下堆栈跟踪如何避免这种情况 org jetbrains android uipreview Renderi
  • SQL Server 2008R2 和创建 XML 文档

    论坛上的第一篇文章 因为我真的被这个问题困住了 以下查询正确地将有效的 XML 文档分配给 xTempXML 变量 类型为 xml 注 文档的长度 转换为varchar max 711 select xTempXML select Pres
  • 使用 XPath 获取属性

    给定一个像这样的 XML 结构
  • 在 System.Xml.XPath 中启用 XPath2 查询(XPathException:无效令牌)

    Microsoft 的 System Xml XPath nuget package 可用于 NET 4 6 声称支持 XPath 1 0 和 2 0 德文档 https msdn microsoft com en us library s
  • CDATA 真的有必要吗?

    我经常使用内联 Javascript 通常是在我制作的 WordPress 主题中 我没有听说过将内联 Javascript 包装在 直到几个月前 几年来我一直在以相当的能力水平做这些事情 我用谷歌搜索了一下 听说人们使用它是因为他们的 J

随机推荐

  • mysql 分库分表

    分表是分散数据库压力的好方法 分表 xff0c 最直白的意思 xff0c 就是将一个表结构分为多个表 xff0c 然后 xff0c 可以再同一个库里 xff0c 也可以放到不同的库 当然 xff0c 首先要知道什么情况下 xff0c 才需要
  • MySQL的数据库引擎的类型

    你能用的数据库引擎取决于mysql在安装的时候是如何被编译的 要添加一个新的引擎 xff0c 就必须重新编译MYSQL 在缺省情况下 xff0c MYSQL支持三个引擎 xff1a ISAM MYISAM和HEAP 另外两种类型INNODB
  • Fast-Planner安装、环境配置以及问题解决

    Fast Planner是香港科技大学沈劭劼老师团队开源的项目 旨在复杂的未知环境中实现四旋翼快速飞行 Fast Planner的github网址为 https github com HKUST Aerial Robotics Fast P
  • 安装双系统出现的一些问题(显卡和无法连接WIFI)

    显卡 问题1 xff1a 安装双系统之后开机黑屏 xff0c 由于显卡引起 xff0c 显卡不支持 解决办法 xff1a 禁用独立显卡或者更改显卡设置 xff0c 进入文件 boot grub grub cfg xff0c 按下图加入标亮字
  • ros没装全,gazebo模型加载不出来

    ros没装全 xff0c gazebo模型加载不出来 安装ros 关于rosdep update 首先换热点试一下 xff0c 在来回切换wifi 按照https blog csdn net yufeng1108 article detai
  • catkin_make遇到 gazebo_ros_controlConfig.cmake相关的问题

    现象 xff1a Could not find a package configuration file provided by gazebo ros control with any of the following names 解决方法
  • 一些vscode自动提示报错

    Pointer to incomplete class type is not allowed 通常是由于类声明了但是没有定义造成的 xff0c 需要做的是在错误文件里面引用下这个类 xff1a class Test xff1b a poi
  • bazel一些用法

    1 编译东西 要在根目录下 xff0c 和WORKSPACE在同一级 例如 xff0c 对于bazelbuild examples 而BUILD文件一般与源文件并列 examples cpp tutorial stage1 main BUI
  • 第十一节std::atomic原子操作

    一 原子操作 1 1原子操作概念例子 互斥量 xff1a 多线程编程中保护共享数据 xff1a 锁 xff0c 操作共享数据 xff0c 开锁 有两个线程 xff0c 对一个变量进行操作 xff0c 这个线程读 xff0c 另一个线程往变量
  • 用Ceres实现PnP

    在ceres中实现PnP优化 xff08 仅优化位姿 xff09 视觉SLAM十四讲 课后习题 ch7 xff08 更新中 xff09
  • deque insert()函数几种用法

    C 43 43 deque insert 用法及代码示例
  • Matplotlib error: No such file or directory: ‘latex‘: ‘latex‘

    Matplotlib error No such file or directory latex latex span class token function sudo span apt span class token function
  • 在ROS下Intel RealSense D435i 驱动的安装,避免踩坑,避免缺少imu话题等各种问题(适用于D400系列、SR300和T265跟踪模块等)

    版权声明 本文为博主原创文章 未经博主允许不得转载 https blog csdn net AnChenliang 1002 article details 109454465 目录 背景 方法1 使用apt安装 不建议使用此方法 了解一下
  • wsl作为开发主机与开发板联调

    linux开发经历记录 wsl作为开发主机与开发板联调 uboot使用nfs网络挂载时使用hanewin搭建win10的nfs servers 背景介绍 小白学习linux开学 xff0c 不想用VM虚拟机作为开发平台 xff0c 恰好了解
  • weka中文乱码解决办法

    由于weka的默认字符集编码是Cp1252 xff0c 所以如果你导入的数据中有中文字符 xff0c 就会出现乱码的情况 xff0c 所以需要weka的RunWeka ini文件 将cp1252替换成你的数据对应的字符集编码 xff0c 比
  • 动态库和静态库的区别

    静态库 xff1a 这类库的名字一般是libxxx a xff1b 1 利用静态函数库编译成的文件比较大 xff0c 因为整个函数库的所有数据都会被整合进目标代码中 xff0c 他的优点就显而易见了 xff0c 2 即编译后的执行程序不需要
  • 重复数据删除技术(Data Deduplication)

    我相信所有人都会同意 xff0c 数据存储正在以飞快地 xff0c 甚至是令人震惊的速度在增长 这意味着为了不影响普通用户的正常使用 xff0c 存储管理员们不得不加班加点地在幕后 工作着 他们的鲜为人知的工作包括 xff1a 配额管理 x
  • TCP/IP协议

    TCP IP 协议栈是一系列网络协议的总和 xff0c 是构成网络通信的核心骨架 xff0c 它定义了电子设备如何连入因特网 xff0c 以及数据如何在它们之间进行传输 TCP IP 协议采用4层结构 xff0c 即应用层 传输层 网络层和
  • 趣谈网络协议-云计算中的协议

  • ros里Catkin的CMakelists/package.xml

    Catkin是基于CMake的编译构建系统 xff0c 具有以下特点 xff1a Catkin沿用了包管理的传统像 find package 基础结构 pkg config扩展了CMake xff0c 例如 软件包编译后无需安装就可使用 自