ROS中自定义 类 的实现

做毕业设计写ROS代码,需要自己写两个类来调用一下,写完之后catkin_make,哗啦啦啦啦报了一堆错,一些涉及到类的使用的,就此列一下。

  1. 先看包的文件结构:
class_ex
├── CMakeLists.txt
├── include
│   └── class_ex
│       └── class_ex.h
├── package.xml
└── src
    ├── class_ex.cpp
    └── class_node.cpp

包名是class_ex;
可执行文件是class_node.cpp;
类名是class_ex,类的定义在class_ex.h里面,具体的函数在class_ex.cpp里面;

  1. 下面放具体的代码:
    class_node.cpp文件:
#include "ros/ros.h"
#include "std_msgs/String.h"
#include "class_ex/class_ex.h"

int main(int argc, char *argv[])
{
	ros::init(argc, argv, "class_node");
	ros::NodeHandle n;
	
	class_ex yingyingying;
	return 0;
}

class_ex.h文件

#include "ros/ros.h"

class class_ex{
public:
	class_ex();
	virtual ~class_ex();
};

class_ex.cpp文件

#include "class_ex/class_ex.h"

class_ex::class_ex(){
    ROS_INFO("CLASS_EX confi");
}

class_ex::~class_ex(){
    ROS_INFO("CLASS_EX delete");
}

其实.h文件与.cpp文件的编写都没什么要注意的地方。
我犯了好多次错的地方是头文件的引用,如果用
#include "class_ex/class_ex.h"
在编译的时候就会这样报错
/class_ex/src/class_node.cpp:3:22: fatal error: class_ex.h: 没有那个文件或目录

  1. 配置CmakeList.txt文件
    这个大概是最令人头痛的部分了吧,尤其对我这种刚接触ROS的小白,完全不知道啥意思,到网上查了不少帖子才写好。
    先放个错的:
add_executable(class_ex
  include/class_ex/class_ex.h
  src/class_ex.cpp
)
add_dependencies(class_ex ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
target_link_libraries(class_ex
  ${catkin_LIBRARIES}
)


add_executable(class_node
  src/class_node.cpp
)
add_dependencies(class_node ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
target_link_libraries(class_node
  ${catkin_LIBRARIES}
)

然后就报了一堆错,下面列出来几条看起来像是错误信息的句子

(.text+0x20):对‘main’未定义的引用
class_ex/CMakeFiles/class_ex.dir/build.make:113: recipe for target '/devel/lib/class_ex/class_ex' failed
/src/class_ex/src/class_node.cpp:10:对‘class_ex::class_ex()’未定义的引用
/src/class_ex/src/class_node.cpp:10:对‘class_ex::~class_ex()’未定义的引用

后来到网上查了查,是因为头文件应该加到库里面,而不是可执行文件,所以改成

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

add_executable(class_node
  src/class_node.cpp
)
add_dependencies(class_node ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
target_link_libraries(class_node
  ${catkin_LIBRARIES}
)

对,就是把第一行的那个add_executable改成add_library(这个配置在Roboware里面实现的话就更方便一些)
但是还是报错,不过错误只剩下了对构造函数和析构函数未定义的引用。

/src/class_ex/src/class_node.cpp:10:对‘class_ex::class_ex()’未定义的引用
/src/class_ex/src/class_node.cpp:10:对‘class_ex::~class_ex()’未定义的引用

又是一个不太好解决的问题,网上找了好多帖子,跟我的原因都不太一样,最后找了个定义了类的源码来看,才发现了问题,改成下面这样,就终于,终于,终于编译过了!!!!!QAQ

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

add_executable(class_node
  src/class_node.cpp
)
add_dependencies(class_node ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
target_link_libraries(class_node class_ex
  ${catkin_LIBRARIES}
)

对,就是在倒数第三行加上”class_ex“(自定义类的对应的库的名字),因为链接的时候要用到吧。

如此,END

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值