不同package间调用.h文件和链接lib.so库的方法

参考链接:https://blog.csdn.net/weixin_43651761/article/details/85557291

在ROS平台上进行开发时,同一个workspace下,希望在新建的package中引用原有的package中的生成的.so库和.h文件。

将自己遇到的问题及解决方案描述如下:

自定义两个package,名字分别为packageA和packageB,假设由packageA调用packageB中的相关头文件和生成的库文件。

1 不同package间对.h文件的调用

假设packageB中被调用的文件为packageB/testB.h。

若此时在packageA的主调文件packageA/testA.h中添加#include <packageB/testB.h>,并进行catkin_make编译,会有如下报警:

#include <packageB/testB.h>

报警:

 fatal error: packageB/testB.h: No such file or directory
#include <packageB/testB.h>

处理步骤

(1)packageB,此时的CMakeLists.txt文件中,catkin_package()项为

catkin_package(
  CATKIN_DEPENDS
  message_runtime
)

修改为

catkin_package(
  INCLUDE_DIRS include (添加) (软件包<packageB>导出的头文件路径)
  CATKIN_DEPENDS
  message_runtime
)

(2)packageA,此时的CMakeLists.txt文件中,find_package()项为

find_package(catkin REQUIRED COMPONENTS
  message_generation
  roscpp
  std_msgs
)

修改为

find_package(catkin REQUIRED COMPONENTS
  message_generation
  roscpp
  std_msgs
  packageB(添加)
)

另外,include_directories需至少包含如下配置

include_directories(
  include ${catkin_INCLUDE_DIRS}
)

(3)packageApackage.xml文件中添加对packageB的依赖

  <build_depend>packageB</build_depend>
  <build_export_depend>packageB</build_export_depend>
  <exec_depend>packageB</exec_depend>

此时再进行catkin_make的编译,可以则可以编译通过。

(4)packageA,testA.h或testA.cpp中对packageB/testB.h的引用格式为

#include <packageB/testB.h>

编译报警:(1)fatal error: packageB/testB.h: No such file or directory

fatal error: packageB/testB.h: No such file or directory
#include <packageB/testB.h>

解决方案

需要被引用的testB.h文件要放在packageB/include/packageB/,而不是放在packageB/include/下。
即正确的testB.h路径为packageB/include/packageB/testB.h,而不是packageB/include/testB.h

编译报警(补充2021/1/9)
(2)对‘moveit::planning_interface::MoveGroupInterface::getCurrentJointValues()’未定义的引用等

CMakeFiles/qtros.dir/src/main_window.cpp.o:在函数‘qtros::MainWindow::MainWindow(int, char**, QWidget*)’中:
main_window.cpp:(.text+0xd2d):对‘moveit::planning_interface::MoveGroupInterface::MoveGroupInterface(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::shared_ptr<tf2_ros::Buffer> const&, ros::WallDuration const&)’未定义的引用
main_window.cpp:(.text+0xe7d):对‘moveit::planning_interface::MoveGroupInterface::~MoveGroupInterface()’未定义的引用
main_window.cpp:(.text+0x11c3):对‘moveit::planning_interface::MoveGroupInterface::~MoveGroupInterface()’未定义的引用
CMakeFiles/qtros.dir/src/main_window.cpp.o:在函数‘qtros::MainWindow::update_listView_CartesianPose(sensor_msgs::JointState_<std::allocator<void> > const&)’中:
CMakeFiles/qtros.dir/src/main_window.cpp.o:在函数‘button_press_process(void*)’中:
main_window.cpp:(.text+0x5640):对‘moveit::planning_interface::MoveGroupInterface::MoveGroupInterface(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::shared_ptr<tf2_ros::Buffer> const&, ros::WallDuration const&)’未定义的引用
main_window.cpp:(.text+0x5767):对‘moveit::planning_interface::MoveGroupInterface::getCurrentJointValues()’未定义的引用
main_window.cpp:(.text+0x5c90):对‘moveit::planning_interface::MoveGroupInterface::~MoveGroupInterface()’未定义的引用
collect2: error: ld returned 1 exit status
qtros/CMakeFiles/qtros.dir/build.make:272: recipe for target '/home/ros_gui_ws/catkin_ws/devel/lib/qtros/qtros' failed
make[2]: *** [/home/ros_gui_ws/catkin_ws/devel/lib/qtros/qtros] Error 1
CMakeFiles/Makefile2:1360: recipe for target 'qtros/CMakeFiles/qtros.dir/all' failed
make[1]: *** [qtros/CMakeFiles/qtros.dir/all] Error 2
Makefile:140: recipe for target 'all' failed
make: *** [all] Error 2
Invoking "make -j3 -l3" failed

原因分析
在这里插入图片描述
解决方案
在这里插入图片描述

2 不同package间对.so库文件的调用

此时用.so库进行类readBin对象声明时,有如下报警,以read_bin为例

read_bin::readBin reda_bin_test_ = new read_bin::readBin()

编译报警:

CMakeFiles/packageA.dir/src/packageA_2.cpp.o: In function `function()':
packageA_2.cpp:(.text+0x81f): undefined reference to `read_bin::readBin::readBin()'
collect2: error: ld returned 1 exit status
make[2]: *** [**] Error 1
make[1]: *** [**] Error 2
make: *** [all] Error 2
Invoking "make -j4 -l4" failed

处理步骤:
(1)packageB,生成库文件,以read_bin为例

add_library(read_bin
  include/packageB/read_bin.h
  src/read_bin.cpp
)
add_dependencies(read_bin ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
target_link_libraries(read_bin
  ${catkin_LIBRARIES}
)

(2)按 “1 不同package间对.h文件的调用”步骤配置好相关参数

(3)packageA,CMakeLists.txt中对需要链接read_bin库的可执行文件或库进行链接配置,package_lib可执行文件为例

add_dependencies(package_lib ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
target_link_libraries(package_lib read_bin
  ${catkin_LIBRARIES}
)

此时再进行编译,可以正常编译完成。

注:链接lib库的方法,在同一个package下同样适用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值