[ROS](03)CMakeLists.txt详解

2023-05-16

  文章只是个人学习过程中学习笔记,主要参考ROS教程1


目录

  • 1、概述
  • 2、CMakeLists.txt文件
    • 2.1 遵循的格式和顺序
    • 2.2 文件解析
    • 2.3 find_package()
    • 2.4 catkin_package()

1、概述

  CMakeLists.txt是用于编译软件包的CMake编译系统的输入文件,几乎可以在任何文本编辑器中进行编辑。该文件描述了如何编译代码以及安装到何处。用于catkin项目的CMakeLists.txt文件是一个标准的附带一些额外约束的vanilla CMakeLists.txt文件。

  catkin是ROS官方自定义的编译系统,它的原理与流程与CMake很相似,和老版本rosbuild相比,支持更好的可移植性(catkin结合了可移植性好的CMake和python)以及交叉编译。(在ROS2使用的编译工具是ament,它是由catkin优化迭代而来的版本)

  CMake语言由 注释(comments)命令(commands)变量(variables)组成。
  CMake相关文档:https://cmake.org/documentation/

2、CMakeLists.txt文件

2.1 遵循的格式和顺序

  CMakeLists.txt文件必须遵循以下格式,否则软件包将无法正确构建。配置中的顺序确实很重要。CMakeLists.txt的基本语法都还是CMake,而catkin在其中添加了少量的宏(见new)。

顺序语法功能备注
1cmake_minimum_required所需的 CMake 版本
2project() 包名
3find_package()查找编译所需的其他 CMake/Catkin 包
4catkin_python_setup() 启用 Python 模块支持new
5add_message_files()添加在msg文件夹中自定义的*.msg消息文件new
add_service_files()添加在srv文件夹中自定义的*.srv服务文件new
add_action_files()添加在avtion文件夹中自定义的*.action动作文件new
6generate_messages() 调用消息/服务/动作生成特定语言的接口文件new
7catkin_package()指定包构建信息导出new
8add_library() 生成库文件
add_dependencies()定义目标文件依赖于其他文件,确保其他目标已被构建
add_executable()生成可执行的二进制文件
target_link_libraries()指定可执行目标链接的库
9catkin_add_gtest()要编译的测试new
10 install()安装规则

2.2 文件解析

# 1 -- 项目所需要的CMake版本,向后兼容 
cmake_minimum_required(VERSION 3.0.2)

# 2 -- 使用CMake project(package-name)声明软件包名称 
# 可以通过使用变量 ${PROJECT_NAME} 在CMake脚本后面的任何位置引用项目名称。
project(beginner_tutorials)

# 3 --  CMake宏,查找编译所需的其他 CMake/Catkin 包(具体分析请看下面的2.3小节)
# [REQUIRED]:当没有满足条件的package时(例如指定的组件未找到等),
#             会终止CMake执行过程,并输出一条错误信息,反之,CMake会继续执行。
# [COMPONENTS]:要查找的组件(components),通常一个pakcage可能包含多个组件。
#               roscpp、rospy...就是catkin的组件。 
#               任何一个找不到就算失败,会终止CMake执行过程。  
# 确保所有这些依赖package也在package.xml中,使用<depend>或<build_denpend>标记。
find_package(catkin REQUIRED COMPONENTS
  roscpp
  rospy
  std_msgs
)

## 查找 PythonLibs 库
# find_package(PythonLibs REQUIRED)

## 查找C++ Boost库的组件库system、thread
# find_package(Boost REQUIRED COMPONENTS system thread)

## 4 -- 启用 Python 模块支持 
## 如果这个package有setup.py,则取消对此的注释。
## 这个宏确保其中声明的模块和全局脚本得到安装 
# catkin_python_setup()

################################################
## Declare ROS messages, services and actions ##
## 声明 ROS 消息、服务和动作					  ##  
################################################

## 5 --  添加在`msg`文件夹中自定义的`*.msg`文件
## 将Message*.msg替换成你的.msg文件,
# add_message_files(
#   FILES
#   Message1.msg
#   Message2.msg
# )

## 5 --  添加在`srv`文件夹中自定义的`*.srv`文件
## 将Service*.msg替换成你的.srv文件
# add_service_files(
#   FILES
#   Service1.srv
#   Service2.srv
# )

## 5 --  添加在`action`文件夹中自定义的`*.action`文件
## 将Action*.action替换成你的.action文件
# add_action_files(
#   FILES
#   Action1.action
#   Action2.action
# )

## 6 --  调用`消息`/`服务`/`动作`生成特定语言的接口文件
## 用于生成所有定义的message、service、action文件,需要添加本文件需要依赖的packages。
## 其实就是告诉编译器,编译 *.msg *.srv *.action 等文件时,需要依赖的库或package。
## Generate added messages and services with any dependencies listed here
# generate_messages(
#   DEPENDENCIES
#   std_msgs  # Or other packages containing msgs
# )

################################################
## Declare ROS dynamic reconfigure parameters ##
################################################
## To declare and build dynamic reconfigure parameters within this
## package, follow these steps:
## * In the file package.xml:
##   * add a build_depend and a exec_depend tag for "dynamic_reconfigure"
## * In this file (CMakeLists.txt):
##   * add "dynamic_reconfigure" to
##     find_package(catkin REQUIRED COMPONENTS ...)
##   * uncomment the "generate_dynamic_reconfigure_options" section below
##     and list every .cfg file to be processed

## Generate dynamic reconfigure parameters in the 'cfg' folder
# generate_dynamic_reconfigure_options(
#   cfg/DynReconf1.cfg
#   cfg/DynReconf2.cfg
# )

###################################
## catkin specific configuration ##
###################################
## 7 -- catkin_package() (具体分析请看下面的2.3小节)
## 由catkin_package生成的文件最终会被安装到devel和build文件夹下。
## INCLUDE_DIRS: 如果package包含头文件,则取消对此行的注释
## LIBRARIES: 项目导出的库
## CATKIN_DEPENDS: 项目依赖的其余catkin项目
## DEPENDS: 项目依赖的其余非catkin项目
catkin_package(
#  INCLUDE_DIRS include
#  LIBRARIES beginner_tutorials
#  CATKIN_DEPENDS roscpp rospy std_msg
#  DEPENDS system_lib
)

###########
## Build ##
###########
## 
## 第一个参数“include”表示包中的include/目录也是路径的一部分。
## catkin_INCLUDE_DIRS:表示建立的环境变量
include_directories(
# include
  ${catkin_INCLUDE_DIRS}
)

## 8 -- add_library() 生成库文件${PROJECT_NAME}
# add_library(${PROJECT_NAME}
#   src/${PROJECT_NAME}/beginner_tutorials.cpp
# )

## 8 -- 定义target依赖的其他target
## add_dependencies(target-name depend-target1 depend-target2 ...)
# add_dependencies(${PROJECT_NAME} ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})

## 8 -- 生成可执行的二进制文件 
## add_executable(<生成> <源文件>)
## 使用${PROJECT_NAME}引用变量,生成一个名为beginner_tutorials_node的可执行文件。
# add_executable(${PROJECT_NAME}_node src/beginner_tutorials_node.cpp)

## Rename C++ executable without prefix
## The above recommended prefix causes long target names, the following renames the
## target back to the shorter version for ease of user use
## e.g. "rosrun someones_pkg node" instead of "rosrun someones_pkg someones_pkg_node"
# set_target_properties(${PROJECT_NAME}_node PROPERTIES OUTPUT_NAME node PREFIX "")

## Add cmake target dependencies of the executable
## same as for the library above
# add_dependencies(${PROJECT_NAME}_node ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})	

##  8 -- 指定可执行目标链接的库
# target_link_libraries(${PROJECT_NAME}_node
#   ${catkin_LIBRARIES}
# )

#############
## Install ##
#############

## 安装python可执行脚本
# catkin_install_python(PROGRAMS
#   scripts/my_python_script
#   DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
# )

## 9 -- 安装规则 -- 目标文件的安装
## DESTINATION:定义了安装的路径
## 可执行二进制文件beginner_tutorials_node 安装到 ${CATKIN_PACKAGE_BIN_DESTINATION}目录
# install(TARGETS ${PROJECT_NAME}_node
#   RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
# )

## ARCHIVE:静态库
## LIBRARY:动态库
## RUNTIME:可执行目标二进制
# install(TARGETS ${PROJECT_NAME}
#   ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
#   LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
#   RUNTIME DESTINATION ${CATKIN_GLOBAL_BIN_DESTINATION}
# )

## 9 -- 安装规则 -- 目录的安装
## 如果目录以“/”结尾,表示将目录中的内容安装到目标路径
## 如果目录不以“/”结尾,表示将目录安装为目标路径下的目录
## PATTERN:用于使用正则表达式进行过滤
# install(DIRECTORY include/${PROJECT_NAME}/
#   DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION}
#   FILES_MATCHING PATTERN "*.h"
#   PATTERN ".svn" EXCLUDE   
# )

## 9 -- 安装规则 -- 普通文件的安装
# install(FILES
#   # myfile1
#   # myfile2
#   DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}
# )

#############
## Testing ##
#############

## 添加基于gtest的cpp测试目标和链接库
# catkin_add_gtest(${PROJECT_NAME}-test test/test_beginner_tutorials.cpp)
# if(TARGET ${PROJECT_NAME}-test)
#   target_link_libraries(${PROJECT_NAME}-test ${PROJECT_NAME})
# endif()

## Add folders to be run by python nosetests
# catkin_add_nosetests(test)

2.3 find_package()

  如果 CMake 通过find_package()2 找到一个package,则会创建几个 CMake 环境变量,这些变量提供有关找到的package的信息。这些环境变量可以稍后在 CMake 脚本中使用。环境变量描述了package导出的头文件在哪里、源文件在哪里、包依赖的库以及这些库的路径。名称始终遵循 <PACKAGE NAME>_<PROPERTY> 的约定:

  • <NAME>_FOUND -:如果找到库,则设置为 true,否则设置为 false
  • <NAME>_INCLUDE_DIRS<NAME>_INCLUDESpackage导出的include路径
  • <NAME>_LIBRARIES<NAME>_LIBSpackage导出的库
  • <NAME>_DEFINITIONS:?

  查找编译所需的其他 CMake/Catkin 包:

find_package(<package-name> REQUIRED COMPONENTS component1 commponent2 …)

  例如:新建的软件包依赖roscpp、rospy、std_msgs

find_package(catkin REQUIRED COMPONENTS
  roscpp
  rospy
  std_msgs
)

  对于这个新建的catkin软件包,将它依赖的其他catkin packages(roscpp、rospy、std_msgs)指定为catin的组件,这是最推荐的方法,这样操作会使它们的include路径libraries路径等附件到catkin_variables中。例如,catkin_INCLUDE_DIRS 不仅包含了catkin package自己的include路径,还包含组件(例如上面的roscpp、rospy、std_msgs)的include路径,在后续的使用中会很方便!

include_directories(${catkin_INCLUDE_DIRS})
target_link_libraries(${PROJECT_NAME}_node ${catkin_LIBRARIES})

既然有这么多好处,为什么不能把find_package(PythonLibs REQUIRED)整合到一起呢?
这是因为find_package()一次只能查找一个package,catkin是指ROS工程中使用catkin工具编译的packages,而且凡是有catkin编译的包都可以作为catkin的组件,也可以作为单独的package,但PythonLibs 不行,因为它不是ros系统的package,属于第三方package。

2.4 catkin_package()

  catkin_package()2 是给依赖本package的package使用的。可以向其他package导出依赖,这些依赖可能包含头文件、库,或者本package依赖的其他package。
  必须在使用add_library()或add_executable()声明任何目标之前调用此函数。该函数有 5 个可选参数:

  • INCLUDE_DIRS - 导出的包的包含路径(即 cflags)
  • LIBRARIES - 从项目中导出的库
  • CATKIN_DEPENDS - 本项目依赖的其他catkin项目
  • DEPENDS - 此项目所依赖的非 catkin CMake 项目
  • CFG_EXTRAS - 附加配置选项

catkin_package()是在/opt/ros/melodic/share/catkin/cmake/catkin_package.cmake文件定义的。调用 catkin_package()之后,会在/devel/share/<package-name>/cmake目录下生成CMake config模式的查找文件:<package-name>Config.cmake<package-name>Config-version.cmake。这样,其他软件包package使用`find_package(…)时就会加载配置文件了,从而获得依赖项。
在这里插入图片描述

   然后我们在看一篇ROS Answers上的问答:What is the purpose of CATKIN_DEPENDS?
https://answers.ros.org/question/58498/what-is-the-purpose-of-catkin_depends/

   DEPENDSCATKIN_DEPENDS是来告诉catkin将你软件包的依赖项传递给使用find_package(…)查找你的软件包package的软件包package。
  
   例如:假设你(调用)find_package(Boost REQUIRED),并且在你的已安装的头文件中(包含)#include <boost/function.hpp>。为了让一个依赖软件包package(别的软件包package)构建和链接你的头文件,他们需要在他们的include路径中有 Boost 的include目录,并且他们需要链接到 Boost 的库。既然你已经在你头文件中使用了它,那么它们应该能从你那获得那个依赖。换言之,正因为它们是依靠你的软件包package构建的,所以它们不需要 find_package(Boost REQUIRED)了,并且不另外使用Boost。
  
  你的软件包package依赖于Boost这一事实是一个实现细节。因此当一些(软件包package)通过find_package(...)查找你的软件包package时,它们能够间接获得对Boost的依赖。其工作方式是在catkin_package(…)调用中放入DEPENDS Boost。在内部,catkin将通过find_package(Boost)获取路径,并且向 ${your_pkg_LIBRARIES} 添加${Boost_LIBRARIES},向${your_pkg_INCLUDE_DIRS}添加${Boost_INCLUDE_DIRS}
  
  我应该注意,catkin 将获取您给它的确切内容并尝试 通过find_package(...) (查找)该软件包package,然后尝试使用该包的_LIBRARIES_INCLUDE_DIRS变量。这个关于find_package(…)布局的假设并不总是成立,因为CMake没有强制这样做。
  例如:当find_package(…)ing Python时:
  find_package(PythonLibs REQUIRED)结果为变量像是PYTHON_INCLUDE_PATH
  find_package(OpenGL REQUIRED) 结果为OPENGL_INCLUDE_DIR
  除了变量前缀的大小写外,这实际的前缀也是不同(PythonLibs -> PYTHON),并且这后缀也是不标准的(PYTHON_INCLUDE_PATH and OPENGL_INCLUDE_DIR vs *_INCLUDE_DIRS)。
  在这种情况下,你需要将使用INCLUDE_DIRS选项的include dirs变量和使用LIBRARIES 选项的库明确地传递给catkin_package(…)
  
  虽然CATKIN_DEPENDS选项和DEPENDS选项非常相似,但是你必须把catkin packages只放在这个list中。对你的 catkin 进行分类的好处是依赖于一个单独的选项,catkin能够进行额外的检查并警告你潜在的不正确的做法。
  
  最后,一个简单的例子CMakeLists.txt:

cmake_minimum_required(VERSION 2.8.3)
project(foo)

find_package(Boost REQUIRED
  COMPONENTS
  system
  thread
)

find_package(PythonLibs REQUIRED)
find_package(OpenGL REQUIRED)

find_package(catkin REQUIRED
  COMPONENTS
  rosconsole
  roscpp
)

include_directories(
  include
  ${catkin_INCLUDE_DIRS}
  ${OPENGL_INCLUDE_DIR}
  ${PYTHON_INCLUDE_PATH}
)

catkin_package(
  INCLUDE_DIRS include ${OPENGL_INCLUDE_DIR}
  LIBRARIES foo ${OPENGL_LIBRARIES}
  CATKIN_DEPENDS roscpp
  DEPENDS Boost
)

..

  在这个例子中,你可以看到我(调用了)find_package(Boost...),并在DEPENDS 部分传递了它,因为它产生了兼容的CMake变量。虽然我(调用了)find_package(PythonLibs...)并在内部使用了它,但是因为它不在我暴露的任何头文件中,所有不需要一起传递。虽然我(调用了) find_package(OpenGL...),但是因为它产生了不兼容的CMake变量,所以我将它明确地传递给 INCLUDE_DIRSLIBRARIES。最后,我(调用了)find_package(catkin...rosconsole roscpp),并在内部使用,但是可能我只在我的.c*文件使用了rosconsole,因此我不需要传递它,所以在CATKIN_DEPENDS变量中我只放了roscpp。
  
  最后一个例子,如果一个package直接使用一个像Boost这样的依赖,它们应该确保通过find_package(...)显式地查找它,并且它们不能通过其他package隐式依赖于它。
  
  发生这种情况的一个例子是,如果一个软件包packagefoo将Boost作为依赖项导出,还有一个依赖于foo的软件包packagebar,但也在内部使用Boost,那么bar将在没有显示依赖Boost的情况下也能正常编译。但是后来foo可能决定重构并删除它对 Boost 的依赖。此刻bar将无法编译,因为它不再具有通过foo对 Boost 的隐式依赖。


  1. ROS.org. ROS教程[EB/OL]. 2020-12-22[2022-7-5].
    http://wiki.ros.org/cn/ROS/Tutorials. ↩︎

  2. ROS.org. CMakeLists.txt[EB/OL]. 2019-07-25[2022-07-05].
    http://wiki.ros.org/catkin/CMakeLists.txt. ↩︎ ↩︎

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

[ROS](03)CMakeLists.txt详解 的相关文章

  • ROS之QtCreator开发环境搭建

    文章目录 系统环境 官方教程 安装 卸载 使用 导入工作空间 构建与运行 编写测试程序 系统环境 操作系统 Ubuntu20 04 ROS版本 Noetic 官方教程 按照官方教程或者下面笔记中的内容均能进行环境搭建 笔记中另外做了部分补充
  • gazebo通过sdf搭建仿真环境和机器人Husky

    具体格式要求可参考 http sdformat org spec ver 1 6 elem sdf
  • Webots小车与Gampping建图仿真与ORB3算法实践

    此篇博客转自本作者在古月居的博客 https www guyuehome com 34537 前言 在研一的时候 由于XXX项目的需要 其中一项就是需要测试Gmapping建图 自然也要求使用ROS系统 由于之前经常在webots中进行仿真
  • V-REP安装

    小知识 是当前目录 是父级目录 是根目录 1 下载V REP 官网地址 http www v rep eu downloads html 我用ubuntu16 04下载V REP PRO EDU V3 5 0 Linux tar 2 解压安
  • ROS学习(1)——ROS1和ROS2的区别

    因为机器人是一个系统工程 它包括了机械臂结构 电子电路 驱动程序 通信框架 组装集成 调试和各种感知决策算法等方面 任何一个人甚至是一个公司都不可能完成机器人系统的研发工作 但是我们又希望自己能造出一个机器人跑一跑 验证一下自己的算法 所以
  • 1-如何安装ROS

    如何安装ROS 大家好 我是如何 今天尝试在Ubantu下安装ROS Robot Operating System 测试环境 虚拟机VMware Ubantu20 04 准备步骤 添加ROS软件源 sudo sh c echo deb ht
  • ROS2踩坑记录

    Vscode 显示 找不到module 以此选择 设置 Python 在setting json中编辑 在 python autoComplete extraPaths 中添加额外的第三方库路径 如 opt ros foxy lib pyt
  • ROS 笔记(01)— Ubuntu 20.04 ROS 环境搭建

    ROS 官网 https www ros org ROS 中文官网 http wiki ros org cn 1 系统和 ROS 版本 不同的 ROS 版本所需的 ubuntu 版本不同 每一版 ROS 都有其对应版本的 Ubuntu 切记
  • 局域网下ROS多机通信的网络连接配置

    1 在路由器设置中固定各机器IP地址 在浏览器中输入路由器的IP地址 例如TP LINK路由器的IP为 192 168 1 1 进入登录页面后 输入用户名和密码登录 用户名一般为admin 密码为自定义 在 基本设置 gt LAN设置 gt
  • 《机器人操作系统入门》课程代码示例安装出错解决方法

    问题描述 学习 机器人操作系统入门 课程时 在Ubuntu 16 04 上安装了kinetic 安装ROS Academy for Beginners时依赖总是报错 如下所示 rosdep install from paths src ig
  • ROS1 ROS2学习

    ROS1 ROS2学习 安装 ROS ROS1 ROS2 命令行界面 ROS2 功能包相关指令 ROS 命令行工具 ROS1 CLI工具 ROS2 CLI工具 ROS 通信核心概念 节点 Node 节点相关的CLI 话题 Topic 编写发
  • 可视化点云

    我在找到的视差图像上有来自 gpu reprojectImageTo3D 的 3D 点 我现在想显示这个点云 如何将找到的点云转换为OpenCV to sensor msgs PointCloud2 我不需要发布点云 这仅用于调试可视化 是
  • 无法加载 LZ4 支持的 Python 扩展。 LZ4 压缩将不可用

    我是 ROS 新手 我刚刚打开终端并输入roscore和另一个终端并键入rostopic node我收到这个错误 上面写着 无法加载 LZ4 支持的 Python 扩展 LZ4 压缩将不可用 我搜索并去了https pypi org pro
  • 不使用ros编译roscpp(使用g++)

    我正在尝试在不使用ROS其余部分的情况下编译roscpp 我只需要订阅一个节点 但该节点拥有使用旧版本ROS的节点 并且由于编译问题 我无法将我的程序与他的程序集成 我从git下载了源代码 https github com ros ros
  • 错误状态:平台不允许不安全的 HTTP:http://0.0.0.0:9090

    我正在尝试从我的 flutter 应用程序连接到 ws local host 9090 使用 rosbridge 运行 的 Ros WebSocket 服务 但我在 Flutter 中收到以下错误 错误状态 平台不允许不安全的 HTTP h
  • catkin_make后找不到ROS包

    我根据 ROS 的 Wiki 页面创建了一个 ROS 工作区 我还使用创建了一个包catkin create pkg在我刚刚创建的工作区下 然后 按照 ROS Wiki 中的步骤使用以下命令构建包catkin make 构建包后 我插入命令
  • 在 ROS - Python 中使用来自多个主题的数据

    我能够显示来自两个主题的数据 但无法在 ROS 中实时使用和计算这两个主题的数据 用 Python 代码编写 您有想法存储这些数据并实时计算吗 谢谢 usr bin env python import rospy import string
  • ROS 从 python 节点发布数组

    我是 ros python 的新手 我正在尝试从 python ros 节点发布一个一维数组 我使用 Int32MultiArray 但我无法理解多数组中布局的概念 谁能给我解释一下吗 或者还有其他方式发布数组吗 Thanks usr bi
  • ROS 问题:libQt5Core.so.5:无法打开共享对象文件:没有这样的文件或目录

    当我跑步时 rosrun turtlesim turtlesim node 在 Ubuntu 上 我收到以下消息 opt ros noetic lib turtlesim turtlesim node 加载共享库时出错 libQt5Core
  • ROS中spin和rate.sleep的区别

    我是 ROS 新手 正在尝试了解这个强大的工具 我很困惑spin and rate sleep功能 谁能帮助我了解这两个功能之间的区别以及何时使用每个功能 ros spin and ros spinOnce 负责处理通信事件 例如到达的消息

随机推荐

  • python特殊数据类型应用(2)元组类型

    目录 标题python特殊数据类型应用 xff08 2 xff09 元组类型元组的定义声明元组元组的访问元组和列表的相互转换元组和列表的区别 标题python特殊数据类型应用 xff08 2 xff09 元组类型 元组的定义 在python
  • python特殊数据类型应用(3)集合类型

    目录 python特殊数据类型应用 xff08 3 xff09 集合类型集合的定义集合的声明集合的运算集合元素的增加 xff1a 交集intersection 并集union差集difference xff1a 对称差集symmetric
  • python中字符串及其格式转换技巧

    目录 python中字符串及其格式转换技巧其他数据转为字符串字符串的格式化带格式限定符的格式化字符串的连接字符串切片字符串转换为 ASCII 值 python中字符串及其格式转换技巧 在python语言中 xff0c 对字符串的处理可以说是
  • Linux命令发送Http的get或post请求(curl和wget两种方法)

    xfeff xfeff Http请求指的是客户端向服务器的请求消息 xff0c Http请求主要分为get或post两种 xff0c 在Linux系统下可以用curl和wget命令来模拟Http的请求 下面就来介绍一下Linux系统如何模拟
  • 让bat文件后台运行

    让bat文件后台运行 文章目录 让bat文件后台运行 前言方法一方法二 前言 bat文件运行时会有一个黑黑的cmd exe窗口 xff0c 很吓人 xff0c 就算用start min命令去运行bat文件 xff0c 电脑的任务栏下仍然会有
  • 5.C语言中全局变量在多个文件中使用

    转自 xff1a https www eefocus com codevisionlife blog 13 12 300658 1a0b8 html 用C语言编写程序的时候 xff0c 我们经常会遇到这样一种情况 xff1a 希望在头文件中
  • 利用GitHub actions实现Docker Image的构建并传送到Docker Hub或者harbor

    目录 1 github actions的介绍 2 dockerfile 的编写 2 1 dockerfile 范例 2 2 其他指令 3 workflow的编写 3 1 上传到docker hub 3 2 上传到 harbor 4 结果展示
  • UCOSIII编写无人机飞控程序——第一篇

    研究无人机飞控已经接近两年 xff0c 作为一个业余的兴趣爱好 兴趣源于看到国外大神Raffaello D 39 Andrea在TED做的无人机演讲和展示 xff0c 感觉无人机很像工程师所施展的魔法 xff0c 给一向给人苦逼印象的工程师
  • 解决 Ubuntu :: Configure: Error: The QtCore Library >= 4.3.0 Could Not Be Found? 问题

    解决 Ubuntu Configure Error The QtCore Library gt 61 4 3 0 Could Not Be Found 问题 作者 19届YJF 日期 2020 10 2 这是我在打 robocup 2D仿真
  • 魔都,3年,程序员到CTO

    过一个平凡无趣的人生实在太容易了 xff0c 你可以不读书 xff0c 不冒险 xff0c 不运动 xff0c 不写作 xff0c 不外出 xff0c 不折腾 但是 xff0c 人生最后悔的事情就是 xff1a 我本可以 陈素封 我可以 在
  • 几种内存泄露检测工具的比较

    概述 内存泄漏 memory leak 指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况 xff0c 在大型的 复杂的应用程序中 xff0c 内存泄漏是常见的问题 当以前分配的一片内存不再需要使用或无法访问时 xff0c 但是却并没
  • ubuntu查看磁盘占用和分配情况

    1 df hl Filesystem Size Used Avail Use Mounted on udev 978M 0 978M 0 dev tmpfs 200M 3 6M 197M 2 run dev sda5 28G 12G 15G
  • Android Studio主菜单(Main Menu)消失后,恢复显示

    当出现这个情况的时候 xff0c 我按找一般软件的办法找了半天也没找到 xff0c 最后没办法只能用万能的百度了 这里只记录一下当前我个人认为比较不错的方法 在Android Studio软件的右上角找到搜索 xff0c 输入Menu xf
  • github响应时间过长,无法访问此网站[已解决]

    某一天或某个时段总是出现 github 响应时间过长 xff0c 无法访问此网站的问题 获取github可以使用的DNS域名 通过站长工具 下的DNS查询 获取TTL值最小的 修改hosts配置 找到hosts xff08 域名解析文件 x
  • STM32(F407)—— 堆栈

    目录 1 SRAM 2 堆栈的作用 3 堆栈的设置 4 堆栈的实现 5 双堆栈机制 堆栈 是一种数据结构 堆栈都是一种数据项按序排列的数据结构 xff0c 只能在一端 称为栈顶 top 对数据项进行插入和删除 xff0c 相应地 xff0c
  • zabbix4.0学习五:Zabbix监控邮箱发送设置

    zabbix4 0学习五 xff1a Zabbix监控邮箱发送设置 文章目录 zabbix4 0学习五 xff1a Zabbix监控邮箱发送设置 前言配置centos安装mailx配置zabbix用户与报警媒介绑定 前言 zabbix里报警
  • STM32(F407)—— 存储区映射和存储器重映射

    Arm Cortex M4 处理器采用哈佛结构 xff0c 可以使用相互独立的总线来读取指令和加载 存储 数据 指令代码和数据都位于相同的存储器地址空间 xff0c 但在不同的地址范围 程序存储器 xff0c 数据存储器 xff0c 寄存器
  • MarkDown语法汇总

    文章目录 总览标题1 使用 号创建标题2 使用 61 和 号创建标题 段落1 换行2 字体格式3 删除线4 脚注5 下划线6 首行缩进7 字体颜色 大小 字体类型8 文本高亮 块引用1 嵌套块引用2 具有其他元素的块引用 列表1 有序列表2
  • 【VCU】详解S19文件(S-record)

    目录 1 概述 2 S record格式 3 S record类型 4 S19文件示例 5 校验和计算示例 6 参考 1 概述 Motorola S record是由Motorola创建的一种文件格式 xff0c 它以 ASCII十六进制
  • [ROS](03)CMakeLists.txt详解

    文章只是个人学习过程中学习笔记 xff0c 主要参考ROS教程1 目录 1 概述2 CMakeLists txt文件2 1 遵循的格式和顺序2 2 文件解析2 3 find package 2 4 catkin package 1 概述 C