共计 2503 个字符,预计需要花费 7 分钟才能阅读完成。
如果想在 windows 上配置 slam 的开发环境,以前是比拟麻烦的,然而当初有了微软 vcpkg 的反对,在 win 上装置依赖也能够像 pip 和 apt 那样难受,尽管还不算那么欠缺,但微软将来还会加大反对。
pangolin 是 slam 零碎实时可视化的一个重要工具,简直各个支流开源我的项目都会用它,但网上对于怎么在 windows 环境装置 pangolin 的博客不太多,大多步骤都十分繁琐,为了躲避编译问题还要使出各种奇技淫巧,集成到我的项目中时也要费一番功夫。
我在 vcpkg 反对的软件包 list 里能看到 pangolin 的最新开源,所以打算用 vcpkg 一键装置。
装置
间接在 vcpkg 根目录下执行:.\vcpkg.exe install pangolin:x64-windows
就会主动装置 pangolin,主动下载相干依赖,主动实现编译,超级不便。目前最新的版本是 0.8。
能够执行:.\vcpkg.exe list
看看装置状况。
pangolin 会依赖 opengl 和 glew,所以它们也会被装置。
接着别忘了集成到 VS 中,对于 vcpkg 的应用能够去找博客疾速理解一下。我这里是集成到全局的,所以在任何我的项目里都能够间接应用装置好的依赖。
测试
新建一个我的项目,用上面的代码测试一下 pangolin 的应用。
#include <pangolin/pangolin.h>
int main(int /*argc*/, char** /*argv*/)
{
// 创立名称为“Main”的 GUI 窗口,尺寸为 640×640
pangolin::CreateWindowAndBind("Main", 640, 480);
// 启动深度测试
glEnable(GL_DEPTH_TEST);
// 创立一个察看相机视图
pangolin::OpenGlRenderState s_cam(pangolin::ProjectionMatrix(640, 480, 420, 420, 320, 320, 0.2, 100),
pangolin::ModelViewLookAt(2, 0, 2, 0, 0, 0, pangolin::AxisY)
);
// 创立交互视图
pangolin::Handler3D handler(s_cam); // 交互相机视图句柄
pangolin::View& d_cam = pangolin::CreateDisplay()
.SetBounds(0.0, 1.0, 0.0, 1.0, -640.0f / 480.0f)
.SetHandler(&handler);
while (!pangolin::ShouldQuit())
{
// 清空色彩和深度缓存
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
d_cam.Activate(s_cam);
// 在原点绘制一个立方体
pangolin::glDrawColouredCube();
// 绘制坐标系
glLineWidth(3);
glBegin(GL_LINES);
glColor3f(0.8f, 0.f, 0.f);
glVertex3f(-1, -1, -1);
glVertex3f(0, -1, -1);
glColor3f(0.f, 0.8f, 0.f);
glVertex3f(-1, -1, -1);
glVertex3f(-1, 0, -1);
glColor3f(0.2f, 0.2f, 1.f);
glVertex3f(-1, -1, -1);
glVertex3f(-1, -1, 0);
glEnd();
// 运行帧循环以推动窗口事件
pangolin::FinishFrame();}
return 0;
}
问题
编译时会报错,一大堆 GL 结尾的未定义标识符,发现是 pangolin 的头文件中找不到位于 gl.h 中的宏定义,对于这个问题我搜寻了很久才找到答案。
pangolin 要用到 opengl,而 opengl 的初始化须要两块货色,一个是 opengl 的 context,一个是函数加载,官网开始文档有具体阐明:https://www.khronos.org/opengl/wiki/Getting_Started。下面装置的 glew 库就是负责第二方面的,即加载 opengl 的函数。
stackoverflow 这篇帖子和我遇到的状况相似:
Lots of undeclared identifiers related to OpenGL using GLFW
有人指出,这些编译谬误是因为应用了微软 SDK 自带的旧版本的 gl.h。
这篇帖子也参考了一下,解答很具体,倡议应用 glew.h 代替 gl.h。
https://stackoverflow.com/questions/17957325/how-do-i-install-a-current-version-of-opengl-for-windows-c
于是我去 pangolin 援用的头文件上来找哪里援用了 gl.h,而后在 glplatform.h 下找到了,这里有许多预处理定义,决定了援用 opengl 相干的头文件。
发现援用的是这个 gl.h,所以就是下面老哥说的,因为援用了微软 SDK 自带的旧版 gl.h 导致编译谬误。
我是装置了 glew 的,所以只有把预处理定义 HAVE_GLEW 加上就好了。
想想也是,因为是用 vcpkg 一键装置的 pangolin,从头至尾没有指定过什么编译选项,所以很多必定是默认的。能够去 vcpkg 的 ports 目录下找到 pangolin 的 portfile.cmake,关上看一下。
编译选项都是关掉的。
这里先不论,从新编译,发现未声明标识符的谬误霎时隐没。不过,还有个 M_PI 标识符未声明,是 gldraw 要用到的宏。
参考:
https://blog.csdn.net/duoduohair/article/details/116561278
接着又报了一个 error 语言性能 “ 结构化绑定 ” 须要编译器标记 “/std:c++17”
这是因为 pangolin 最新版本用到了 c ++17 的个性。
参考:
https://blog.csdn.net/aoxuestudy/article/details/112313824
ok,总算是跑进去了。