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

广西玉林网站建设wordpress单本小说站

广西玉林网站建设,wordpress单本小说站,哪个网站财经做的最好,网站锚文本与标签在已安装二进制movit2的情况下,想使用自编译moveit2,只要引入一下自编译moveit2库的环境变量即可。主要是想搞明白这个过程发生了什么,也就是引入环境后有什么变化,以及如何对编译过程产生影响 一、setup.bash流程 所有资料上都…
  • 在已安装二进制movit2的情况下,想使用自编译moveit2,只要引入一下自编译moveit2库的环境变量即可。主要是想搞明白这个过程发生了什么,也就是引入环境后有什么变化,以及如何对编译过程产生影响

一、setup.bash流程

  • 所有资料上都说setup.bash作用就是添加环境,其实就是将对应的地址添加到不同的环境变量当中了,这里主要想分析一下这个过程是如何实现的
  • 主要 关注的环境变量是LD_LIBRARY_PATH、CMAKE_PREFIX_PATH、AMENT_PREFIX_PATH

1、运行source ./install/setup.bash效果

==========运行source ./install/setup.bash前==========
~/ws_moveit2$ echo $LD_LIBRARY_PATH
/usr/local/etherlab/lib:/opt/ros/humble/opt/rviz_ogre_vendor/lib:/opt/ros/humble/lib/x86_64-linux-gnu:/opt/ros/humble/lib~/ws_moveit2$ echo $CMAKE_PREFIX_PATH~/ws_moveit2$ echo $AMENT_PREFIX_PATH
/opt/ros/humble
  • 运行后自己包中的所有lib文件就添加到LD_LIBRARY_PATH变量中,类似~/ws_moveit2/install/moveit_ros_planning_interface/lib的地址
  • CMAKE_PREFIX_PATH和AMENT_PREFIX_PATH变量添加了很多类似~/ws_moveit2/install/moveit_ros_planning_interface的地址

2、./install/setup.bash文件分析

  • 文件中用的是shell语言,跟命令行中用的一样。不过两个语法略有不同,属于不同的shell类型,大部分差不多

(1)定义_colcon_prefix_chain_bash_source_script()函数

_colcon_prefix_chain_bash_source_script() {if [ -f "$1" ]; thenif [ -n "$COLCON_TRACE" ]; thenecho "# . \"$1\""fi. "$1"  elseecho "not found: \"$1\"" 1>&2fi
}

(2)加载基础ros环境

COLCON_CURRENT_PREFIX="/opt/ros/humble"  #系统中ros的安装位置
_colcon_prefix_chain_bash_source_script "$COLCON_CURRENT_PREFIX/local_setup.bash" #运行对应的bash文件
  • 每个工作空间都默认加载了基础的环境变量

(3)加载当前工作空间的环境

COLCON_CURRENT_PREFIX="$(builtin cd "`dirname "${BASH_SOURCE[0]}"`" > /dev/null && pwd)"
_colcon_prefix_chain_bash_source_script "$COLCON_CURRENT_PREFIX/local_setup.bash"
  • 这里比较复杂的就是第一行,测试一下就可以那段命令就是运行
builtin cd "`dirname "${BASH_SOURCE[0]}"`" > /dev/null && pwd

结果就是返回了当前路径

~/ws_moveit2/install
  • 具体语法解读
    builtin cd : 使用内置命令cd
    ${BASH_SOURCE[0]} : 这个变量显示此脚本的位置包括文件名
    dirname : 取出地址,即取出文件名
    ‘ ’ : 先执行反引号内部的命令
    /dev/null : 把输出放入黑洞设备,也就是不输出
    上面命令一起就是cd到当前,然后再用pwd输出即可传递给COLCON_CURRENT_PREFIX

(4)删除定义的变量和函数

unset COLCON_CURRENT_PREFIX
unset _colcon_prefix_chain_bash_source_script
  • 删除定义的变量和函数

3、./install/local_setup.bash文件分析

(1)添加地址到环境变量

_colcon_prefix_bash_prepend_unique_value() {# arguments_listname="$1"_value="$2"# get values from variableeval _values=\"\$$_listname\"# backup the field separator_colcon_prefix_bash_prepend_unique_value_IFS="$IFS"IFS=":"# start with the new value_all_values="$_value"_contained_value=""# iterate over existing values in the variablefor _item in $_values; do# ignore empty stringsif [ -z "$_item" ]; thencontinuefi# ignore duplicates of _valueif [ "$_item" = "$_value" ]; then_contained_value=1continuefi# keep non-duplicate values_all_values="$_all_values:$_item"doneunset _itemif [ -z "$_contained_value" ]; thenif [ -n "$COLCON_TRACE" ]; thenif [ "$_all_values" = "$_value" ]; thenecho "export $_listname=$_value"elseecho "export $_listname=$_value:\$$_listname"fififiunset _contained_value# restore the field separatorIFS="$_colcon_prefix_bash_prepend_unique_value_IFS"unset _colcon_prefix_bash_prepend_unique_value_IFS# export the updated variableeval export $_listname=\"$_all_values\"unset _all_valuesunset _valuesunset _valueunset _listname
}

(2)添加前缀地址到COLCON_PREFIX_PATH

_colcon_prefix_bash_prepend_unique_value COLCON_PREFIX_PATH "$_colcon_prefix_bash_COLCON_CURRENT_PREFIX"
unset _colcon_prefix_bash_prepend_unique_value

(3)检查python环境变量

if [ -n "$COLCON_PYTHON_EXECUTABLE" ]; thenif [ ! -f "$COLCON_PYTHON_EXECUTABLE" ]; thenecho "error: COLCON_PYTHON_EXECUTABLE '$COLCON_PYTHON_EXECUTABLE' doesn't exist"return 1fi_colcon_python_executable="$COLCON_PYTHON_EXECUTABLE"
else# try the Python executable known at configure time_colcon_python_executable="/usr/bin/python3"# if it doesn't exist try a fall backif [ ! -f "$_colcon_python_executable" ]; thenif ! /usr/bin/env python3 --version > /dev/null 2> /dev/null; thenecho "error: unable to find python3 executable"return 1fi_colcon_python_executable=`/usr/bin/env python3 -c "import sys; print(sys.executable)"`fi
fi

(4)加载另外的bash脚本,并根据COLCON_TRACE决定是否输出调试信息

  • 下面这个代码不是原版,有一些调试信息
echo "==========================="
echo "2"
echo $1
echo "3"
echo $COLCON_TRACE
_colcon_prefix_sh_source_script() {if [ -f "$1" ]; thenif [ -n "$COLCON_TRACE" ]; thenecho "# . \"$1\""fiecho "source \"$1\"". "$1"elseecho "not found: \"$1\"" 1>&2fi
}echo "===========================1"
echo "${_colcon_ordered_commands}"
# get all commands in topological order
_colcon_ordered_commands="$($_colcon_python_executable "$_colcon_prefix_bash_COLCON_CURRENT_PREFIX/_local_setup_util_sh.py" sh bash)"echo "===========================1.5"
echo "${_colcon_ordered_commands}"unset _colcon_python_executable
if [ -n "$COLCON_TRACE" ]; thenecho "$(declare -f _colcon_prefix_sh_source_script)"echo "# Execute generated script:"echo "# <<<"echo "${_colcon_ordered_commands}"echo "# >>>"echo "unset _colcon_prefix_sh_source_script"
fi
echo "===========================2"
echo $AMENT_PREFIX_PATH
echo "===========================3"
echo "${_colcon_ordered_commands}"
eval "${_colcon_ordered_commands}"
unset _colcon_ordered_commandsunset _colcon_prefix_sh_source_scriptunset _colcon_prefix_bash_COLCON_CURRENT_PREFIX
echo "==========================="
echo $AMENT_PREFIX_PATH
  • 下面这行运行了_local_setup_util_sh.py文件,生成了添加地址到指定环境变量的命令将其存到_colcon_ordered_commands
_colcon_ordered_commands="$($_colcon_python_executable "$_colcon_prefix_bash_COLCON_CURRENT_PREFIX/_local_setup_util_sh.py" sh bash)"
  • 下面这步则是直接执行_colcon_ordered_commands
eval "${_colcon_ordered_commands}"

二、find_package流程

相关资料:

  • https://blog.csdn.net/weixin_41652700/article/details/128914776?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522a7d6f436d89e18bbe78a29bb97f8df50%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=a7d6f436d89e18bbe78a29bb97f8df50&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2blogfirst_rank_ecpm_v1~rank_v31_ecpm-1-128914776-null-null.nonecase&utm_term=cmake&spm=1018.2226.3001.4450
  • https://blog.csdn.net/m0_73640344/article/details/144246881

1、 find_package搜索地址

  • find_package实际上是在找对应的.cmake文件,这些文件会生成对应的_DIR、_LIB、_INCLUDE环境变量名。我在写一个moveit相关代码时,cmakelist中有如下内容
find_package(moveit_ros_planning_interface REQUIRED)
  • 这个搜索的地址是~/ws_moveit2/install/moveit_ros_planning_interface/share/moveit_ros_planning_interface/cmake

2、正常编译结果

message("==============find_package前=========")
message("moveit_ros_planning_interface_FOUND: ${moveit_ros_planning_interface_FOUND}")
message("moveit_ros_planning_interface_INCLUDE_DIRS: ${moveit_ros_planning_interface_INCLUDE_DIRS}")
message("moveit_ros_planning_interface_LIBRARIES: ${moveit_ros_planning_interface_LIBRARIES}")
message("moveit_ros_planning_interface_LIBRARY_DIRS: ${moveit_ros_planning_interface_LIBRARY_DIRS}")
message("moveit_ros_planning_interface_VERSION: ${moveit_ros_planning_interface_VERSION}")
message("moveit_ros_planning_interface_DIR: ${moveit_ros_planning_interface_DIR}")
find_package(moveit_ros_planning_interface REQUIRED)
message("==============find_package后=========")
message("moveit_ros_planning_interface_FOUND: ${moveit_ros_planning_interface_FOUND}")
message("moveit_ros_planning_interface_INCLUDE_DIRS: ${moveit_ros_planning_interface_INCLUDE_DIRS}")
message("moveit_ros_planning_interface_LIBRARIES: ${moveit_ros_planning_interface_LIBRARIES}")
message("moveit_ros_planning_interface_LIBRARY_DIRS: ${moveit_ros_planning_interface_LIBRARY_DIRS}")
message("moveit_ros_planning_interface_VERSION: ${moveit_ros_planning_interface_VERSION}")
message("moveit_ros_planning_interface_DIR: ${moveit_ros_planning_interface_DIR}")
  • 在find_package前这些变量都不存在
  • 没有引入手动编译moveit的工作空间的环境变量,所以在find_package后的环境变量都是在/opt/ros/humle中的,以下是其中的一部分
moveit_ros_planning_interface_FOUND: 1    #找到包
moveit_ros_planning_interface_INCLUDE_DIRS: /opt/ros/humble/include/geometry_msgs;/opt/ros/humble/include/moveit_msgs;/usr/include/bullet;/opt/ros/humble/include;   #头文件地址
moveit_ros_planning_interface_LIBRARIES: /opt/ros/humble/lib/libbuiltin_interfaces__rosidl_generator_c.so;/opt/ros/humble/lib/libbuiltin_interfaces__rosidl_typesupport_fastrtps_c.so;   #库文件
moveit_ros_planning_interface_LIBRARY_DIRS:             #空
moveit_ros_planning_interface_VERSION: 2.5.8    #版本
moveit_ros_planning_interface_DIR: /opt/ros/humble/share/moveit_ros_planning_interface/cmake   #cmake地址

3、使用手动编译moveit2

  • 关键就是添加set(moveit_ros_planning_interface_DIR “~/ws_moveit2/install/moveit_ros_planning_interface/share/moveit_ros_planning_interface/cmake”)
  • 然后将缺失的so文件添加到LD_LIBRARY_PATH环境变量,这一步也可以用cmake中连接器的相关语法,根本原因在于虽然告诉用find_package告诉了编译器怎么编译(比如CMAKE_CURRENT_SOURCE_DIR等变量),但是和环境变量相关的连接过程还是没有变化,所以要手动添加环境或者在连接器上给出具体位置(最简单的还是直接source运行一下手动编译moveit的bash文件)

4、自写库使用find_package()

资料:
https://zhuanlan.zhihu.com/p/669872914
https://www.cnblogs.com/linxmouse/p/16778116.html

  • find_packagge()有模块和配置两种模式。模块模式一般就是自己写的cmake文件,一般是Find<package_name>.cmake文件格式。配置模式就是第三方库官方提供的cmake文件,一般是<package_name>Config.cmake格式。

(1)自写库

  • cpp文件、h头文件和CMakeList文件都跟一般代码一样,只是生成库文件。关键就是在cmake文件中添加一些变量。
src/MyLibrary.cpp
#include "MyLibrary.h"
#include <iostream>namespace MyLibrary {void printMessage() {std::cout << "Hello from MyLibrary!" << std::endl;}
}
include/MyLibrary.h
#ifndef MYLIBRARY_H
#define MYLIBRARY_Hnamespace MyLibrary {void printMessage();
}#endif // MYLIBRARY_H
CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(MyLibrary VERSION 1.0)# 添加库
add_library(MyLibrary src/MyLibrary.cpp)# 包含头文件目录
target_include_directories(MyLibrary PUBLIC include)
cmake/FindMyLibrary.cmake
set(MyLibrary_FOUND true)
set(MyLibrary_INCLUDE_DIR /home/wangyuanhao/communication_with_thread/find_package_test/include/)
set(MyLibrary_LIBRARIES_DIR /home/wangyuanhao/communication_with_thread/find_package_test/build/)

(2)调用自写库

  • find_package只是调用了cmake文件,只是会再一些特定路径下搜索,用include直接调用cmake即可。
src/main.cpp
#include <MyLibrary.h>int main() {MyLibrary::printMessage();return 0;
}
CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(MyApp)# 查找 MyLibrary
set(CMAKE_MODULE_PATH /home/wangyuanhao/communication_with_thread/find_package_test/cmake)  #将cmake路径添加到模块路径CMAKE_MODULE_PATH,这样find_package才能找到
message(CMAKE_MODULE_PATH:${CMAKE_MODULE_PATH})find_package(MyLibrary REQUIRED)
#include(/home/wangyuanhao/communication_with_thread/find_package_test/cmake/FindMyLibrary.cmake)#跟find_package效果一样message(MyLibrary_INCLUDE_DIR:${MyLibrary_INCLUDE_DIR})# 添加可执行文件
add_executable(MyApp src/main.cpp)# 链接 MyLibrary
target_link_libraries(MyApp PRIVATE /home/wangyuanhao/communication_with_thread/find_package_test/build/libMyLibrary.a)if (MyLibrary_INCLUDE_DIR)target_include_directories(MyApp PRIVATE ${MyLibrary_INCLUDE_DIR})
endif()

文章转载自:

http://gaiWeeiK.qdxtj.cn
http://2V4N01NZ.qdxtj.cn
http://K2szHtoW.qdxtj.cn
http://RmcEfpFp.qdxtj.cn
http://hzzxL3AI.qdxtj.cn
http://RkXUCCUf.qdxtj.cn
http://1OncSZsX.qdxtj.cn
http://CUtag2Me.qdxtj.cn
http://LU4JZoJ2.qdxtj.cn
http://va6n4678.qdxtj.cn
http://IUvfYHvY.qdxtj.cn
http://ogW1GiHP.qdxtj.cn
http://4JjUkJFo.qdxtj.cn
http://SzT1MNdk.qdxtj.cn
http://XQnA4fhe.qdxtj.cn
http://Gj811mFq.qdxtj.cn
http://0eqHxynw.qdxtj.cn
http://oNVaf0Gv.qdxtj.cn
http://ECrlXuIS.qdxtj.cn
http://e7awRNo9.qdxtj.cn
http://UlZ7N3v3.qdxtj.cn
http://QiabDrh0.qdxtj.cn
http://xvskLril.qdxtj.cn
http://VWj5S6vm.qdxtj.cn
http://QRgfV8Yj.qdxtj.cn
http://83Hbs151.qdxtj.cn
http://a47ayN8X.qdxtj.cn
http://afgvLoFY.qdxtj.cn
http://2VGEXrPv.qdxtj.cn
http://dyNmgKrw.qdxtj.cn
http://www.dtcms.com/wzjs/637449.html

相关文章:

  • 网站建设平台排行榜手机版房屋3d效果图设计软件
  • 张槎手机网站建设广州十大营销策划公司
  • 企业网站设置网页的依托网站
  • 房地产网站建设内容wordpress 菜单横线
  • 便宜网站空间上海网商电子商务有限公司
  • 爱站网关键词长尾挖掘可信网站可信站点
  • 中国建设银行官网站纪念币预约北京网站建设好
  • 二手房网签合同在哪个网站做凡客诚品购物网
  • 网站制作的相关术语海南搜索引擎优化
  • 全球网站访问量排名wordpress 文字背景
  • 网站关键词排名怎么提升郑州郑东新区
  • 怎么写网站建设的说明书wordpress 标题入库
  • 福州服务专业公司网站建设视频直播需要哪些设备
  • 营销型网站制作服务商汕尾住房和建设局网站首页
  • 网站备案查询官网软件下载网站开发
  • 购物网站开发中查看订单的实现逻辑wordpress完整备份
  • 网站alexa排名查询科技布
  • 可以用vs做网站建设吗网站如何实现多语言
  • 网站建设制作过程建设网站大概需要多少钱
  • 建设部网站安全事故中国住房和城乡建设部网站公文
  • 国外mod大型网站建设团购网站费用
  • 凡科网站建设套餐报价仿5173网站
  • 做网站app价格多少钱网页云原神
  • 遂宁网站开发如何查询网站空间
  • 哪里有手机网站制作公司网站页面设计制作
  • 长沙做网站哪个最好重庆开县网站建设公司
  • 想学习网站建设网页界面设计公司
  • 网络营销跟做网站有什么区别[网络收集]form表单及网站开发中常用js表单取值方法
  • 企业网站的作用和目的办公室装修设计方案
  • 巩义服务专业网站建设广州去东莞回来要隔离吗