ROS2使用glog库部分问题整理

文章讲述了作者在从ROS1迁移至ROS2环境中使用glog时遇到的编译错误,涉及抽象类和纯虚函数的实现问题。通过源码安装与在线安装glog的对比,作者解决了因头文件路径问题导致的编译问题,最终通过修改本地logging.h文件解决了冲突。
摘要由CSDN通过智能技术生成

本来是在ros1下调用glog库是正常的。
然后最近需要在ros2环境下工作,就顺便安装一下glog。

先说一下错误信息

‘GLOG_EXPORT’ does not name a type
这个会附带很长的相关报错。
例如下面这样
error <glog/logging.h> was not include correctly. See the documentation for how to consume the library.
解决方法:
在CMakeList中添加
add_compile_definitions(GLOG_USE_GLOG_EXPORT)

error: invalid new-expression of abstract class type’logger::Logger’
logger::Logger* logger = new Logger(google::base::GetLogger(google::INFO))

后面的note信息是:
because the following virtual functions are pure within ‘logger::Logger’:
class Logger : public google::base::Logger {

/usr/local/include/glog/logging.h
‘virtual void google::base::Logger::Write(bool, const char*, size_t)’
virtual void Write(bool force_flush,

查询了一下’invalid new-expression of abstract class type’是因为实例化了抽象类导致的。
而当前的Logger类的父类是google::base::Logger类,父类也是一个抽象类,所以应该是继承父类时,其纯虚函数Write未在子类中实现导致子类Logger也是抽象类。

分析出原因后,我发现我在Ros2安装时是源码安装的,其安装目录为usr/local/include,而其中的google::base::Logger类的Write是这样的
virtual void Write(bool force_flush, const std::chrono::system_clock::time_point& time stamp, const char* message, size_t message_len) = 0;

这与logger.h中的子类Write函数是无法对应的。
所以是最好在线安装,
因为我当前主机不能连接网络,所以去Ubuntu官网下载了gflags和glog的deb并安装了。
发现其安装目录是在usr/include下。
但我的工程死活索引不到usr/include下的logging.h文件(被自己菜到崩溃…)如果有懂的大佬可以教学一下。

所以我就直接修改了usr/local/include下的logging.h文件
将Write函数修改为与子类一致即可:
virtual void Write(bool force_flush, time_t time_stamp, const_char* message, int message_len) = 0;

问题解决。

  • 8
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值