引用的自定义库总是报错,如:
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} )
然后就可以愉快的编译运行了。