在ubuntu上安装pcl库并配置vscode使用cmake生成可执行文件

2023-11-02

在ubuntu上安装pcl库并配置vscode使用cmake生成可执行文件

在ubuntu上安装配置pcl的时候踩了不少坑,最后使用vscode+cmake搞定了整套流程。

先列举一下我踩的坑:

  • pcl1.9.1需要调用vtk7.1的库文件,但是vtk并没有完全被安装,单独安装vtk7.1可以解决问题;
  • 安装vtk7.1的时候需要提前并安装下载Qt5,否则不能成功Configure;
  • vscode中手动设置task.json需要为g++添加许多include和库文件,这些文件很难找全导致编译失败,使用cmake并编写配套的CMakeList.txt可以解决这个问题;
  • vscode中包含的库文件出现红色下划线,需要在c_cpp_properties.json中设置compileCommands文件的路径,并在tasks.json中设置cmake生成compile_commands.json文件;
  • 文件已经成功编译了,但是显示出几个奇怪的方框,让我不知道其实我已经编译成功了,只需要按’r’就调整视角即可。

完整的正确流程如下:

一、安装vtk7.1

这里参考这篇博文:https://blog.csdn.net/weixin_46474546/article/details/104711901

  • QT(http://download.qt.io/archive/qt/)
  • VTK7.1.1(https://vtk.org/download/)
  • PCL1.9.1(https://github.com/PointCloudLibrary/pcl/releases)

QT5.12.6

  • 下载(https://download.qt.io/archive/qt/5.12/5.12.6/qt-opensource-linux-x64-5.12.6.run)

  • 下载文件夹下运行

    chmod +x qt-opensource-linux-x64-5.12.6.run
    ./qt-opensource-linux-x64-5.12.6.run
    
  • 安装的时候记住要安装全部的Qt文件,只勾选开发工具是不可以的

VTK7.1.1

  • 下载tar.gz包(https://www.vtk.org/files/release/7.1/VTK-7.1.1.tar.gz)

  • 安装X11,openGL,CMake

sudo apt-get install libx11-dev libxext-dev libxtst-dev libxrender-dev libxmu-dev libxmuu-dev
sudo apt-get install build-essential libgl1-mesa-dev libglu1-mesa-dev
sudo apt-get install cmake cmake-qt-gui
  • CMake生成工程
  1. 解压VTK-7.1.1.tar.gz,在VTK-7.1.1文件夹中建立build文件夹
  2. 打开CMake软件GUI界面,设置“where is the source code:” 为源代码所在目录/VTK-7.1.1。设置“where to build the binaries:”为工程生成的目录/VTK-7.1.1/build(手动新建一个)
  3. 点击“Configure”按钮,在弹出对话框中选择“Unix MakeFiles”
  4. 选中“VTK_GROUP_Qt”选项,再次点击“Configure”按钮,提示警告信息,需要设置Qt5安装路径
  5. VTK_QT_VERSION 选择 “5” 再次点击“Configure”按钮
  6. Qt5_DIR设置路径为QT的安装目录 /opt/Qt5.12.6/5.12.6/gcc_64/lib/cmake/Qt5
  7. 提示“Configure done”,点击“Generate”按钮,在build中生成工程文件
  • 编译安装

在build目录中运行下面的命令

sudo make
sudo make install

二、安装pcl1.9.1

安装依赖库

  • PCL依赖Boost,Eigen,FlANN,VTK,OpenNI,QHull,metslib等第三方库:
sudo apt-get install libflann1.8 libflann-dev
sudo apt-get install libeigen3-dev
sudo apt-get install libboost-all-dev 
sudo apt-get install cmake cmake-qt-gui libusb-1.0-0-dev libusb-dev libudev-dev  mpi-default-dev openmpi-bin openmpi-common  libqhull* libgtest-dev freeglut3-dev pkg-config  libxmu-dev libxi-dev mono-complete libopenni-dev libopenni2-dev libpng-dev 
sudo apt-get install libpcap-dev
sudo apt-get install libglew-dbg libglew-dev libglew1.13 libglewmx-dbg libglewmx-dev libglewmx1.13 glew-utils
sudo apt-get install libqhull*
  • 安装metslib库:
wget http://www.coin-or.org/download/source/metslib/metslib-0.5.3.tgz
tar zxvf metslib-0.5.3.tgz
cd metslib-0.5.3
./configure
make
sudo apt-get install autoconf automake libtool
sudo make install

安装PCL库

  • 下载pcl文件(https://github.com/PointCloudLibrary/pcl/archive/refs/tags/pcl-1.9.1.tar.gz),如果有网络问题建议在网上找同名包

  • 解压并进入解压出的PCL-1.9.1文件夹,运行

mkdir build && cd build
cmake  -D CMAKE_BUILD_TYPE=None  -D BUILD_GPU=ON  -D BUILD_apps=ON  -D BUILD_examples=ON ..
sudo make
sudo make install

三、使用vscode+cmake编译例程

参考:http://vegetable.wodekouwei.com/2019/04/21/l-cmake-syntax/

  • 默认已经完成了vscode以及插件的安装

  • 建立如下的文件结构,其中.vscode和build是文件夹

.
├── .vscode
├──├──c_cpp_properties.json
├──├──launch.json
├──├──tasks.json 
├── build
├── CMakeLists.txt
└── pcl_test.cpp

  • c_cpp_properties.json
{
    "configurations": [
        {
            "name": "Linux",
            "includePath": [
                "${workspaceFolder}/**",
                "/usr/include",
                "/usr/local/include"
            ],
            "defines": [],
            "compilerPath": "/usr/bin/gcc",
            "cStandard": "c11",
            "cppStandard": "c++17",
            "intelliSenseMode": "clang-x64",
            "compileCommands": "${workspaceFolder}/build/compile_commands.json"
        }
    ],
    "version": 4
}
  • launch.json
{
    // 使用 IntelliSense 了解相关属性。 
    // 悬停以查看现有属性的描述。
    // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        

        {
            "name": "(gdb) Launch",
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceFolder}/build/pcl_test",// 表示可执行程序所在的路径,其中,${workspaceRoot}表示VScode加载的文件夹的根目录
            "args": [],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": true,
            "MIMode": "gdb",
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ],
            "preLaunchTask": "make build"
        }
    ]
}
  • tasks.json
{
    // See https://go.microsoft.com/fwlink/?LinkId=733558
    // for the documentation about the tasks.json format
    "version": "2.0.0",
    "tasks": [
        {
            "label": "make build",//编译的项目名,build
            "type": "shell",
            "command": "cd ./build ;cmake ../ -DCMAKE_EXPORT_COMPILE_COMMANDS=1 ;make",//编译命令
            "group": {
                "kind": "build",
                "isDefault": true
            }
        },
        {
            "label": "clean",
            "type": "shell",
            "command": "make clean",
            

        }
    ]
}
  • CMakeLists.txt
cmake_minimum_required(VERSION 2.6)
project(pcl_test)

find_package(PCL 1.9 REQUIRED)

include_directories(${PCL_INCLUDE_DIRS})
link_directories(${PCL_LIBRARY_DIRS})
add_definitions(${PCL_DEFINITIONS})

add_executable(pcl_test pcl_test.cpp)

target_link_libraries (pcl_test ${PCL_LIBRARIES})

install(TARGETS pcl_test RUNTIME DESTINATION bin)
  • pcl_test.cpp
#include <pcl/visualization/cloud_viewer.h>
#include <iostream>
#include <pcl/io/io.h>
#include <pcl/io/pcd_io.h>

int user_data;

void 
viewerOneOff (pcl::visualization::PCLVisualizer& viewer)
{
    viewer.setBackgroundColor (1.0, 0.5, 1.0);
    pcl::PointXYZ o;
    o.x = 1.0;
    o.y = 0;
    o.z = 0;
    viewer.addSphere (o, 0.25, "sphere", 0);
    std::cout << "i only run once" << std::endl;

}

void 
viewerPsycho (pcl::visualization::PCLVisualizer& viewer)
{
    static unsigned count = 0;
    std::stringstream ss;
    ss << "Once per viewer loop: " << count++;
    viewer.removeShape ("text", 0);
    viewer.addText (ss.str(), 200, 300, "text", 0);

    //FIXME: possible race condition here:
    user_data++;
}

int 
main ()
{
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);
    pcl::io::loadPCDFile ("cat.pcd", *cloud);

    pcl::visualization::CloudViewer viewer("Cloud Viewer");

    //blocks until the cloud is actually rendered
    viewer.showCloud(cloud);

    //use the following functions to get access to the underlying more advanced/powerful
    //PCLVisualizer

    //This will only get called once
    viewer.runOnVisualizationThreadOnce (viewerOneOff);

    //This will get called once per visualization iteration
    viewer.runOnVisualizationThread (viewerPsycho);
    while (!viewer.wasStopped ())
    {
    //you can also do cool processing here
    //FIXME: Note that this is running in a separate thread from viewerPsycho
    //and you should guard against race conditions yourself...
    user_data++;
    } 
    return 0;
}
  • F5运行,生成的可执行文件就在build文件夹下,名字为pcl_test
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在ubuntu上安装pcl库并配置vscode使用cmake生成可执行文件 的相关文章

  • C++,多语言/本地化支持

    向 C 程序添加多语言支持的最佳方法是什么 如果可能 应该从包含键值对 WelcomeMessage Hello s 之类的纯文本文件中读取语言 我想到了添加一个 localizedString key 函数来返回加载的语言文件的字符串 有
  • strtok() 和空字段

    我正在将一些 C 结构序列化为字符串 然后将其反序列化strtok 但不幸的是 strtok 不检测空字段 例如 1 2 4 有没有替代功能 在linux上有strsep http www mkssoftware com docs man3
  • 从数组中输入多个数字,每个数字检查是否为整数

    每个人 我希望有人能帮我弄清楚C语言的一些东西 这是我第一次认真地做IT方面的作业 我没有经验 而且我正在电子学习中学习 所以老师的帮助不是很好 我需要用C语言开发控制台应用程序 用户需要输入10个整数 如果插入的数字不是整数 需要输出错误
  • Web 应用程序框架:C++ 与 Python

    作为一名程序员 我熟悉 Python 和 C 我正在考虑编写自己的简单 Web 应用程序 并且想知道哪种语言更适合服务器端 Web 开发 我正在寻找一些东西 它必须是直观的 我认识到 Wt 存在并且它遵循 Qt 的模型 我讨厌 Qt 的一件
  • 委托和接口如何互换使用?

    我可以使用接口方法代替委托吗 如何 我发现搜索接口方法比使用委托更快 我希望有一个简单的代码片段 理论上 可以通过包含单个方法的接口 例如 Java 没有委托 来完成委托完成的所有工作 然而 它使代码变得更加冗长并且没有带来什么好处 话又说
  • 运行 C# exe 文件

    复制 为什么我的 NET 应用程序在从网络驱动器运行时会崩溃 https stackoverflow com questions 148879 why does my net application crash when run from
  • File.ReadAllLines 或流读取器

    我们可以使用以下方式读取文件StreamReader http msdn microsoft com en us library vstudio system io streamreader或通过使用File ReadAllLines ht
  • .NET Core 2 - 从启动中调用存储库方法[重复]

    这个问题在这里已经有答案了 我有以下存储库和类 public interface IValueService GetAll public class ValueService IValueService private DataContex
  • 如何使用 C# 调用 REST API?

    这是我到目前为止的代码 public class Class1 private const string URL https sub domain com objects json api key 123 private const str
  • 如何使用 DesignData 帮助开发 Metro 应用程序?

    我一直在 Windows Phone 应用程序中愉快地使用 DesignData 我希望使用它来帮助在 VS2012 Blend for VS 中的 Metro 风格应用程序中可视化设计 我已经尝试过希望显而易见的方法
  • WCF 客户端返回空数组 - XML 响应似乎正常

    我正在尝试为我们的 Intranet 上托管的 Web 服务创建一个简单的 WCF 客户端 C 使用 Fiddler 和 SoapUI 我可以看到请求和响应似乎正常 但是当我运行代码时返回一个空数组 我会尝试只粘贴相关的行 但会是很多东西
  • 模板“内联”函数的静态局部变量[重复]

    这个问题在这里已经有答案了 static的局部变量inline如果我的理解是正确的 C 中的函数保证像单个全局变量一样存在 如果inline函数是一个模板 编译器可以在哪里生成该函数的多个版本 下面这篇文章应该很好地回答你的问题 http
  • 谷歌基准迭代的意义是什么?

    我正在使用 Google Benchmark 来测量某些代码的执行时间 例如 我编写了以下代码来测量其执行时间性能 include
  • Bool类型返回规则

    我使用 dapper ORM 所以我使用两个规则Query
  • 如何在 C# 中停止程序进一步执行

    string FirstName Console ReadLine if FirstName Length gt 12 Console WriteLine if FirstName Length lt 3 Console WriteLine
  • 使用可变参数模板函数计算多个值的平均值

    我正在尝试编写一个函数来确定任意数量参数的平均值 所有参数都具有相同的类型 出于学习目的 我尝试使用可变参数模板函数来做到这一点 这是我到目前为止所拥有的 template
  • 我们可以使用 C# 录制发送到扬声器的声音吗

    我有一个软件 SoundTap Streaming Audio Recorder 它记录发送到扬声器的任何音频 无论流是来自网络还是来自某些文件或麦克风 我可以在桌面应用程序中制作这样的应用程序 以便我可以录制发送到扬声器的流 无论来源如何
  • 仅最后一个用户控件显示内容控件

    我有一个奇怪的问题 我创建了一个带有标签和画布的用户控件 画布引用资源 但画布仅显示在我的堆栈面板中的最后一个控件上 这是我的窗户
  • 使用 System.Json 迭代 JSON

    我正在探索 NET 4 5 的功能System Json库 但没有太多文档 而且由于流行的 JSON NET 库 搜索起来相当棘手 我基本上想知道 我如何循环一些 JSON 例如 People Simon Age 25 Steve Age
  • 使用 Powershell 或 C# 获取 Azure“文件和文件夹”作业状态

    我一直在尝试找到一种方法来获取在 AzureRM 中运行的几个客户上运行的 文件和文件夹 备份作业的状态 可以在 AzureRm 门户中手动找到状态 恢复服务保管库 gt 作业 gt 备份作业 使用powershell不显示任何作业信息 G

随机推荐

  • ApiSix 配置 jwt-auth认证

    有问题要学会阅读apisix官方文档 养成好习惯 点我开始学习 1 为签发 token 的 API 配置一个 Route 该路由将使用 public api 插件 在对应的服务器执行以下命令 我尝试通过面板来创建这个Route 发现创建的时
  • Fedora21 入门体验笔记

    以前都是由于对linux的好奇 所以把各种版本都装了个遍 但每次都会因为某些原因 eq 不能玩游戏 用 很麻烦而且不爽 没用几天然后又回到windows 而且最后什么都没有留下 这一次是想真正学习linux 顺便记下使用过程中遇到的一些问题
  • OpenGL 入门教程(八)

    OpenGL 入门教程 八 OpenGL中使用RGBA色彩体系 RGB为红绿蓝三原色 A为 值 该值代表色彩融合时所占的比例 颜色是顶点的重要属性之一 没有色彩的世界是毫无生气的 使用glColor R G B A 设定当前颜色 此后定义所
  • pyecharts各种图表实现(超级全)

    目录 平面直角坐标系 直方图 折线图 箱形图 散点图 带涟漪效果散点图 k线图 热力图 象型图 层叠图 地理图表 GEO 地理坐标系 MAP 地图 BMAP 百度地图 基本图表 饼图 漏斗图 仪表盘 水球图 日历图 关系图 平行坐标系 极坐
  • Springboot整合FastDFS

    文章目录 一 FastDFS Client的实践 1 FastDFS Client的主要特性 2 SpringBoot测试操作FastDFS 1 SpringBoot的配置 2 测试springboot环境下javaapi对分布式文件系统上
  • 商汤PySot的配置使用(1)---siam跟踪算法demo、test、eval

    文章目录 简介 一 环境配置 二 demo 2 1 步骤一 加入工程的python路径 2 2 步骤二 下载模型 2 3 步骤三 编辑demo 三 test 3 1 步骤一 数据集 json文件准备 3 2 步骤二 OTB100等数据集的注
  • 【区块链介绍】区块链的来龙去脉

    1 了解区块链技术的起源 分布式系统 弱中心化是区块链思想的核心 P2P网络 为区块链提供了网络层基础架构 任何一个节点都能与其他节点进行传输 与其它节点保持一致 共识算法 区块链技术的核心 实现了数据的一致存储 密码学 为区块链数据的传输
  • 高数——彻底搞懂如何判断反常积分收敛和发散

    反常积分收敛和发散 预备知识 复杂的反常积分 真题 预备知识 1 极限 不定积分与定积分的基本计算 2 找等价无穷小 3 无穷小和无穷大速度的比较 趋向无穷大的速度 x x x x xx gt e
  • Celery介绍以及使用

    文章目录 celery 一 什么是celery 1 celery是什么 2 使用场景 3 Celery的优点 4 Celery的安装 二 Celery执行异步任务 1 创建异步任务执行文件 消费者 2 创建生产者文件 3 创建result文
  • InnoDB引擎架构

    逻辑存储结构 表空间 ibd文件 一个mysql实例可以对应多个表空间 用于存储记录 索引等数据 段 分为数据段 索引段 回滚段 InnoDB是索引组织表 数据段就是B 树的叶子节点 索引段即为B 树的非叶子节点 段用来管理多个Extent
  • Vue中vuex的使用(三)

    vuex中getters的使用 1 概念 当state中的数据需要经过加工后再使用时 可以使用getters加工 2 在store js中追加getters配置 准备getter 用于将state中sum加工 const getters b
  • vue如何获取当前页面的url

    如果你使用 vue router 文档在这里 路由信息对象的属性 const routes path portfolio year review component Portfolio 这个样子获取 this route params ye
  • 二十一.数据结构学习笔记.1

    一 抽象数据类型 抽象数据类型 Abstract Data Type ADT 是一些操作的集合 抽象数据类型是数学的抽象 在ADT定义中根本没涉及如何实现这些操作 例如 表 集合 图及它们的操作 它们都可以看作抽象数据类型 就像整数 实数和
  • cmake:if

    有条件地执行一组命令 概要 if
  • java笔记:抽象方法与抽象类

    抽象方法和抽象类 1 规则 抽象方法和抽象类必须用abstract进行修饰 有抽象方法的类只能被定义为抽象类 抽象类中可以没有抽象方法 抽象类不能被实例化 无法使用new调用抽象类的构造器创建抽象类的实例 无法创建实例 抽象类中可以包含成员
  • 网络安全渗透测试实验一

    1 实验目的和要求 理解网络扫描 网络侦察的作用 通过搭建网络渗透测试平台 了解并熟悉常用搜索引擎 扫描工具的应用 通过信息收集为下一步渗透工作打下基础 系统环境 Kali Linux 2 Windows 网络环境 交换网络结构 实验工具
  • pyqt5数据库使用教程

    1 关于连接sqlite数据库时使用QSqlTableModel模型查看具体数据 通过行号 列名称来获取某单元格的数据 注 model中的一行称为一条record 一列称为一条field 方法 1 使用QSqlRecord类 QSqlRec
  • Python中的pass语句详解

    作者 永劫 一 概述 在本文中 我们将详细介绍Python中的pass语句 包括其定义 作用以及使用场景 pass语句在Python编程中是一个实用的占位符 它可以让程序运行在某些特定的情况下 而不引发任何错误 二 pass语句的定义 pa
  • scrapy框架之post请求

    scrapy框架之post请求 1 post请求 2 通过scrapy框架用爬虫发起post请求 3 使用Scrapy框架破解验证码 1 post请求 首先从浏览器打开百度翻译 去抓一下接口 右键检查 一开始是network是什么都没有的
  • 在ubuntu上安装pcl库并配置vscode使用cmake生成可执行文件

    文章目录 在ubuntu上安装pcl库并配置vscode使用cmake生成可执行文件 先列举一下我踩的坑 一 安装vtk7 1 QT5 12 6 VTK7 1 1 二 安装pcl1 9 1 安装依赖库 安装PCL库 三 使用vscode c