文章目录
Pangolin在windows编译记录
本来是在ubuntu下使用的轻量级可视化软件,这里为了使用ciltrano需要用Pangolin用于可视化,因此尝试在Window10,vs2017下编译Pangolin。
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所示,发现已经添加。然后通过F12定位到源码中Packet类的定义文件中,并结合其他Pangolin的定义文件,发现缺少PANGOLIN_EXPORT这个宏定义,导致在编译tool工具中的VideoJson工程项目时可以找到Packet(通过头文件),但是由于没有导出VideoJson找不到对应的实现过程。
PocketStream遇到的问题及解决方案同上。
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.3. 工程文件名字修改
发现Pangolin编译的Debug和Release版本的动态库文件名字都是一样的,这个在后续使用时很容易搞错而导致不可预料的运行错误,因此将工程中全部的Debug版本的库(.lib.dll.pdb)文件全都改成了${ProjectName}_d的形式,例如pangolin_d.dll,这里还需要注意的是,在编译时lib,dll,pdb的文件需要单独改,应该在cmakelist中可以批量改,但是不想那么麻烦了。就手动修改先。
3. Cmake编译
批生成时,直接install会因为修改了库的名字而在安装时找不到对应的可执行文件,因此需要找到对应的cmake_install.cmake 文件手动修改。如图 3.1所示。
4. 带Eigen的编译
其实在cmake构建工程的时候已经手动选择了Eigen的路径,但是在Pangolin中还是没有识别到正确的Eigen的路径,导致在编译好的Pangolin中没有Eigen也无法使用ToEigen这个函数,因此需要在编译Pangolin时将Eigen添加进去。重新开始编译。在预处理器定义中添加HAVE_EIGEN这个宏定义。
5. 开放其他接口
在编译cilantro的时候遇到界面字体错误,于是修改了默认字体的导出方式,对原始Pangolin不会有影响,而是cilantro可以编译通过了。