关于c++:windows安装最新pangolin-v08

46次阅读

共计 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,总算是跑进去了。

正文完
 0