ROS1重温:自定义头文件、源文件
- 自定义头文件、源文件的意义
- 自定义头文件
- 创建自定义头文件
- 使用头文件,并在程序中直接实现函数功能
- 修改 CMakeLists.txt 文件
- 自定义头文件中实现函数功能的源文件
- 创建自定义头文件
- 使用头文件,并在程序中直接实现函数功能
- 修改 CMakeLists.txt 文件
自定义头文件、源文件的意义
- 一般情况下,我们都是调用别人的库文件,直接在头部引述标准库文件,例如 #include “ros/ros,h” 等文件
- 在开发大型工程的时候,难免会出现某些函数需要反复使用,小到一个对象,大到整个源代码文件,我们不可能在每次需要他们的时候都加入到代码中。
- 如果直接加入,冗余代码量增加,导致程序性能降低、可靠性降低、且会极大影响后期维护。
- 综上,我们通过将常用的函数进行封装,变为一个库函数,在使用时直接调用即可。
自定义头文件
创建自定义头文件
- 在路径:head_demo/include/head_demo/ ( 包文件名/include/包文件名/ )下,创建头文件 hello.h
- 在类中可以看到 public,这是用于声明代码的使用范围,具体有如下四种等级,以及其对应的四个范围的可用情况
| 类内部 | 子类 | 包内部 | 包外部 |
---|
public | √ | √ | √ | √ |
protected | √ | √ | √ | × |
default | √ | √ | × | × |
private | √ | × | × | × |
#ifndef _HELLO_H_
#define _HELLO_H_
namespace hello_ns
{
class MyHello
{
public:
void run();
};
}
#endif
使用头文件,并在程序中直接实现函数功能
- 在 src/ 下,创建 hello.cpp 文件,具体代码如下:
#include "ros/ros.h"
#include "head_demo/hello.h"
namespace hello_ns
{
void MyHello::run()
{
ROS_INFO("run 函数执行...");
}
}
int main(int argc, char *argv[])
{
setlocale(LC_ALL, "");
ros::init(argc, argv, "head_hello_node");
hello_ns::MyHello myHello;
myHello.run();
return 0;
}
修改 CMakeLists.txt 文件
- 需要加入包文件中的 include 目录,用于声明自定义头文件位置,具体修改如下
include_directories(
include
${catkin_INCLUDE_DIRS}
)
add_executable(head_hello_node src/hello.cpp)
add_dependencies(head_hello_node${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
target_link_libraries(head_hello_node
${catkin_LIBRARIES}
)
自定义头文件中实现函数功能的源文件
创建自定义头文件
- 在路径:head_src_demo/include/head_src_demo/ ( 包文件名/include/包文件名/ )下,创建头文件 hello.h,具体代码如下(和上面的一样):
#ifndef _HELLO_H_
#define _HELLO_H_
namespace hello_ns
{
class MyHello
{
public:
void run();
};
}
#endif
使用头文件,并在程序中直接实现函数功能
- 在 src/ 下,先创建 hello.cpp 源文件,实现自定义头文件中所提到的函数,具体代码如下:
#include "ros/ros.h"
#include "head_src_demo/hello.h"
namespace hello_ns
{
void MyHello::run()
{
ROS_INFO("源文件的 run() 函数...");
}
}
- 创建 use_hello.cpp ,调用 hello.h 源文件,具体代码如下:
#include "ros/ros.h"
#include "head_src_demo/hello.h"
int main(int argc, char *argv[])
{
setlocale(LC_ALL, "");
ros::init(argc, argv, "use_hello_node");
hello_ns::MyHello myHello;
myHello.run();
return 0;
}
修改 CMakeLists.txt 文件
- 需要加入包文件中的 include 目录
- 需要加入实现头文件中函数的源文件路径,以及对原文件的编译、链接
- 具体修改如下
include_directories(
include
${catkin_INCLUDE_DIRS}
)
add_library(head_src
include/${PROJECT_NAME}/hello.h
src/hello.cpp
)
add_executable(use_hello_node src/use_hello.cpp)
add_dependencies(head_src ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
add_dependencies(use_hello_node ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
target_link_libraries(head_src
${catkin_LIBRARIES}
)
target_link_libraries(use_hello_node
head_src
${catkin_LIBRARIES}
)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)