Pangolin在Windows编译记录

8 篇文章 0 订阅
8 篇文章 0 订阅

Pangolin在windows编译记录

本来是在ubuntu下使用的轻量级可视化软件,这里为了使用ciltrano需要用Pangolin用于可视化,因此尝试在Window10,vs2017下编译Pangolin。

1. 首先看结果

图 1.1 编译结果

2. 源码下载

这里使用经过修改后的源代码:github,因为原始的代码编译为库文件时没有导出函数的,因此直接编译会出现一点小问题。所以需要对源码进行简单的修改。

2.1. 链接器错误

问题:LNK2019 无法解析的外部符号 “public: __cdecl pangolin:: Packet::~Packet(void)” (??1Packet@pangolin@@QEAA@XZ),该符号在函数 main 中被引用 VideoJsonPrint D:\Software\Pangolin\build\tools\VideoJson\main-print.obj
问题解析:根据错误提示可以看出是在VideoJson项目中的main函数中的Packet找不到对应的实现过程。这个问题出现的原因可以归结为:

  • 对应类的实现没有找到,即缺少了lib文件;
  • 虽然添加了正确的lib文件,但是该类没有导出,因此无法外部访问。

在这里插入图片描述

图 2.1 附加依赖项

解决方案:此时需要看当前工程是不是正确添加了链接中的附加依赖项。经过检查如图 2.1所示,发现已经添加。然后通过F12定位到源码中Packet类的定义文件中,并结合其他Pangolin的定义文件,发现缺少PANGOLIN_EXPORT这个宏定义,导致在编译tool工具中的VideoJson工程项目时可以找到Packet(通过头文件),但是由于没有导出VideoJson找不到对应的实现过程。
PocketStream遇到的问题及解决方案同上。

在这里插入图片描述

图 2.2 修改文件

在这里插入图片描述

图 2.3 其他Pangolin导出类时的定义

在这里插入图片描述

图 2.4 修改后的文件定义

2.2. 运行库版本不对应

问题:LNK2005 “public: int __cdecl std::basic_streambuf<char,struct std::char_traits >::sputc(char)” (?sputc@? b a s i c s t r e a m b u f @ D U ? basic_streambuf@DU? basicstreambuf@DU?char_traits @D@std@@@std@@QEAAHD@Z) 已经在 pangolin.lib(pangolin.dll) 中定义VideoJsonPrint D:\Software\Pangolin\build\tools\VideoJson\libcpmtd.lib(locale.obj) 1。
问题解析:因为将Pangolin编译为动态库版本,而工程中的运行库还是多线程调试的MT/MTd版本,和windows系统中的libcpmtd.lib版本不一致。
解决方案:因此需要将工程中都换成MD版本的,即动态库版本的,Debug对应MDd,Release对应MD版本
在这里插入图片描述

图 2.5 运行库版本不一致

2.3. 工程文件名字修改

发现Pangolin编译的Debug和Release版本的动态库文件名字都是一样的,这个在后续使用时很容易搞错而导致不可预料的运行错误,因此将工程中全部的Debug版本的库(.lib.dll.pdb)文件全都改成了${ProjectName}_d的形式,例如pangolin_d.dll,这里还需要注意的是,在编译时lib,dll,pdb的文件需要单独改,应该在cmakelist中可以批量改,但是不想那么麻烦了。就手动修改先。

在这里插入图片描述

图 2.6 lib修改

3. Cmake编译

批生成时,直接install会因为修改了库的名字而在安装时找不到对应的可执行文件,因此需要找到对应的cmake_install.cmake 文件手动修改。如图 3.1所示。

在这里插入图片描述

图 3.1 修改lib名字之后install出错

在这里插入图片描述

图 3.2 Cmake编译Pangolin

在这里插入图片描述

图 3.3 样例运行

4. 带Eigen的编译

其实在cmake构建工程的时候已经手动选择了Eigen的路径,但是在Pangolin中还是没有识别到正确的Eigen的路径,导致在编译好的Pangolin中没有Eigen也无法使用ToEigen这个函数,因此需要在编译Pangolin时将Eigen添加进去。重新开始编译。在预处理器定义中添加HAVE_EIGEN这个宏定义。

在这里插入图片描述

图 4.1 附加Eigen的编译

5. 开放其他接口

在编译cilantro的时候遇到界面字体错误,于是修改了默认字体的导出方式,对原始Pangolin不会有影响,而是cilantro可以编译通过了。
在这里插入图片描述

图 5.1 导出字体定义

在这里插入图片描述

图 5.2 导出与显示相关的接口函数
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值