ROS引用自定义库文件及方法整理及详细教程

引用的自定义库总是报错,如:

1、fatal error: package_h_learn/add_count.h: 没有那个文件或目录

2、在函数‘main’中:test_pkg.cpp:(.text+0x19e):对‘add_num(int, int)’未定义的引用

这两种错误,其一,是找不到该头文件,其二是连接不上该函数的实现

现在,本文从头到尾,说明这两个问题的解决方法,以及解决原理。

本文的代码部分参考:ROS引用头文件及动态链接库的方法

关于CMakeList.txt的介绍参考:ROS的CMakeList文件详解

 一、引用本功能包中的库文件

创建package_h_learn包,在包下新建include文件夹

在include中自定义一个头文件:add_count.h,预定义 INIT_COUNT = 89 ;函数 add_num()

#ifndef _add_count_
#define _add_count_

#define INIT_COUNT 89

int add_num(int a , int b);

#endif

在包下创建src文件夹,存放该头文件的源码,新建add_count.cpp文件,实现add_num()函数;

#include "package_h_learn/add_count.h" //引用自定义的头文件

int add_num(int a , int b)	//头文件函数声明的实现
{
	int sum;
	sum = a + b;
	return sum;
}

如果使用RoboWare,此时CMakeList.txt中会出现自动添加如下代码

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

下面创建一个会用到该头文件的可执行文件,h_learn.cpp

#include "ros/ros.h"
#include "std_msgs/String.h"
#include 

#include "package_h_learn/add_count.h" //引用自定义的头文件

int main(int argc, char **argv)
{
    ros::init(argc,argv,"h_learn");
    ros::NodeHandle n;
    ros::Publisher pub = n.advertise("listener",1000);
    ros::Rate loop_rate(10);
    
    int count =INIT_COUNT;	//头文件宏定义初始化INIT_COUNT
    int num;
    num = add_num(count,5);

    while(ros::ok())
    {
        std_msgs::String msg;
        std::stringstream ss;

        ss<<"Hello world  "<

 此时的CMakeList.txt中会自动添加

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

此时,可以试着编译一下,一定会出现开头说的错误2,这就是没链接源文件,修改方法也很简单,将刚刚在CMakeList.txt 自动添加的target_link_libraries(h_learn ${catkin_LIBRARIES}),中进行修改,添加需要执行的源文件

target_link_libraries(h_learn add_count ${catkin_LIBRARIES})

此时,你会发现,编译通过了,该代码可以运行了。

当然,还有更简单的CMakeList.txt的写法,不过为了和下一步其他功能包调用该文件一致,我就都这么写了。

二、引用其他功能包中的库函数

 

首先,要修改刚刚建立的功能包的CMakeList文件

catkin_package(
 INCLUDE_DIRS include
# LIBRARIES ${PROJECT_NAME}
# CATKIN_DEPENDS other_catkin_pkg
# DEPENDS system_lib
)

 这一项的作用就是,可以让其他包能找到我们的头文件add_count.h

建立一个新的功能包test_package,在功能包中新建src文件夹,并新建test_pkg.cpp文件,并将刚刚h_learn.cpp中的代码复制过来,然后就需要配置了,毕竟现在我们的test_package还不知道去哪里找add_count.h这个文件,以及里面的函数。

修改test_package中的xml文件,以添加依赖,增加

    package_h_learn
    package_h_learn

接下来就需要修改test_package中的CMakeList文件,第一步是找到所需的头文件

 find_package(catkin REQUIRED COMPONENTS
     roscpp
     package_h_learn  # 新添加内容
)

第二步是找到所需的头文件函数的实现,与上文的操作基本相同,如下

target_link_libraries(test_pkg add_count  ${catkin_LIBRARIES} )

然后就可以愉快的编译运行了。

你可能感兴趣的:(ROS)