做毕业设计写ROS代码,需要自己写两个类来调用一下,写完之后catkin_make,哗啦啦啦啦报了一堆错,一些涉及到类的使用的,就此列一下。
- 先看包的文件结构:
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里面;
- 下面放具体的代码:
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: 没有那个文件或目录
- 配置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