使用QT5加载ROS和Opencv的方法以及遇到的一些问题
一、系统配置
ubuntu16.04 + ROS-Kinetic + Qt5.8.0 + Opencv3.3.1
1、利用Qt加载ROS的库
由于本人不太习惯qtcreator-plugin-ros的使用方法,所以想直接用Qtcreator直接导入ROS的库来运行ROS的Code。
导入的部分主要都是在Qt项目的pro文件中完成的。这里参考了一些前辈的教程,具体链接如下:
https://blog.csdn.net/ipfpm/article/details/83504491
其中主要有两部分工作,一部分是添加ROS包的include即头文件,另一部分是lib文件即链接库。
2、利用Qt加载Opencv的库
参考链接:
https://blog.csdn.net/wanzhen4330/article/details/82622664
同样的方法,一个是添加Opencv的 INCLUDEPATH,一个是添加Opencv的LIBS。
二、遇到的问题
由于在我的项目中需要在Qt的界面显示ROS发布的视频流,所以我参考了这位博主的教程
如何在Qt界面上显示ROS发布的视频消息!
https://blog.csdn.net/qq_30460905/article/details/80489841
但是他的项目是用qtcreator-plugin-ros框架完成的,并没有pro文件,所以在这方面有些差异。
参照着它的代码我写好之后报了如下的错误:
undefined reference to "image_import::....."
undefined reference to "cv_bridge::........"
查询资料后得知,这两个报错的模块都是ROS的头文件,因为ROS的INCLUDEPATH的设置正确,所以在写代码的过程中都能把文件包含到工程当中来,但是在编译过程中由于缺少上述头文件的源文件,所以编译失败。
而缺少源文件的原因是,在用QT导入ROS库的过程中,上述教程中添加的库文件并不全。在LIBS这一项缺少库文件。如果使用上述两个模块应该在LIBS这加上
LIBS += -L /opt/ros/kinetic/lib -lcv_bridge -limage_transport
加上这句话后,编译成功!
LIBS中的-l 和 -L参数
转https://blog.csdn.net/lieyanhaipo/article/details/17056011
-l 参数是用来指定程序要连接的库, -l参数紧接着就是库名, 库名和真正的库文件名的差别, 以数学库为例,其库名为 m , 其 库文件名为 libm.so,也就是把库名头文件的lib 和 .so 去掉就是库名。 放在/lib, /usr/lib 和 /usr/local/lib 中的库直接使用参数 -l 链接就可以了, 如果没有放在这三个文件中, 那么我们就要使用-L 加上库文件所在的文件夹, 然后再使用 -l 加上库名就好了。