前言
本文自定义源文件的目的是把源文件和可执行文件分离,在执行时结构可以更清晰,之前的一篇文章中简要介绍了如何自定义头文件并调用,感兴趣的朋友可以点这里 >自定义头文件并调用<
1.头文件、源文件、可执行文件定义
首先了解一下这三种文件的定义,头文件是.h文件,用来存放类的声明,平时用的#include<math.h>就是包含这种文件;源文件是指.cpp文件,一般用来放在头文件声明的类成员函数的具体实现;可执行文件,顾名思义就是创建用来执行的.cpp文件,通过与源文件及头文件进行链接后执行源文件中的函数实现功能。
2.创建功能包
打开vscode,在工作空间src目录下右键单击create catkin package,命名功能包,这里命名为self_definition_source,回车,继续添加依赖项,roscpp rospy std_msgs,再次回车则一个新的功能包创建完成
3.新建头文件
鼠标放置在功能包self_definition_source中include的self_definition_source目录下右键创建头文件self.h;然后先声明头文件,再声明namespce、class和函数
4.新建源文件
在功能包的src目录下右键新建一个.cpp文件,这里命名为self_definition_source.cpp,再在里面编写代码,函数里用ROS_INFO在终端输出"自定义源文件使用~"这条消息
#include"self_definition_source/self_head.h"
#include"ros/ros.h"
namespace self_ns {
void self_cl::zidingyi()
{
ROS_INFO("自定义源文件使用~");
}
}
写好后include的部分会有红色波浪线警告,是因为引用头文件需要在c_cpp_properties.json中把文件路径包含进去(只需添加一次),注意如果在路径后面添加新的路径记得加逗号
5.创建可执行文件
和源文件类似,创建一个命名为exe_source.cpp的文件,然后写入代码,函数部分主要是设置中文、节点初始化和函数调用三部分
#include"self_definition_source/self_head.h"
#include "ros/ros.h"
int main(int argc, char *argv[])
{
setlocale(LC_ALL,"");//设置中文防止乱码
ros::init(argc,argv,"head_info");//节点初始化
//函数调用
self_ns::self_cl print_info;
print_info.zidingyi();
return 0;
}
6.配置cmakelists.txt文件
打开CMakeLists.txt文件,修改以下几行对C++库和可执行文件进行配置,文件才能正常运行
(1)配置C++库
include_directories(
include
${catkin_INCLUDE_DIRS}
)
add_library(de_so
include/${PROJECT_NAME}/self_head.h
src/self_definition_source.cpp
)
add_library里的${PROJECT_NAME}可以任意定义,只要和下面一致即可,这里命名为de_so
add_dependencies(de_so ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
target_link_libraries(de_so
${catkin_LIBRARIES}
)
(2)配置可执行文件
add_executable(exe_source src/exe_source.cpp)
add_dependencies(exe_source ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
target_link_libraries(exe_source
de_so//链接到C++库
${catkin_LIBRARIES}
)
7.运行
按Ctrl+shift+B进行编译,编译后打开新终端,设置环境变量,rosrun运行,终端输出了我们在源文件中设置的消息
总结
自定义源文件调用在这里只是简单举了个例子,并走了整个流程,源文件中定义了函数并在里面编写了我们想要输出的消息,然后运行时执行可执行文件对源文件中的函数进行调用,所以源文件可以作为函数封装的文件,我们只需要与其链接就可以使用可执行文件进行调用,不需要在文件本身定义,可以使代码结构更简洁清晰