搭建PCL和liblas过程中遇到的一些问题汇总

装这两个库真的是要吐了, 本文不教装环境,仅仅记录本人在装环境过程中出现的关键问题
liblas和PCL的安装就不多说了,网上教程一大堆,最重要的要了解有什么依赖库再动手,比如说boost,eigen,VTK,numpy,cmake等等一大堆,先装依赖库,装好了之后再去编译源码,关于PCL库没啥好说的,就是依赖库装好按着流程来就行了。
在编译liblas的过程中存在着比较致命的问题,我从github上面下载的源码,你可能存在的问题主要有以下两个,其他的我认为都是依赖库没装好的原因,每次出错要认真阅读错误并分析原因:

1 cmake版本问题

可以参见我的博客:解决cmake Policy CMP0057 is not set: Support new IN_LIST if() operator
https://blog.csdn.net/Woosual/article/details/106682989

2 源码问题

Ubuntu 16.04, libLAS 1.8.1, Error while building at boost::bind…
这个是跟boost库有关,这个问题可以在liblas的issue中找到
https://github.com/libLAS/libLAS/issues/186
你出现的问题可能是这样的:
[ 1%] Building CXX object src/CMakeFiles/las.dir/header.cpp.o
/home/yuksel/Downloads/liblas/src/header.cpp: In copy constructor ‘liblas::Header::Header(const liblas::Header&)’:
/home/yuksel/Downloads/liblas/src/header.cpp:104:11: warning: variable ‘p’ set but not used [-Wunused-but-set-variable]
void* p = 0;
^
/home/yuksel/Downloads/liblas/src/header.cpp: In member function ‘liblas::Header& liblas::Header::operator=(const liblas::Header&)’:
/home/yuksel/Downloads/liblas/src/header.cpp:123:15: warning: variable ‘p’ set but not used [-Wunused-but-set-variable]
void* p = 0;
^
/home/yuksel/Downloads/liblas/src/header.cpp: In member function ‘void liblas::Header::DeleteVLRs(const string&, uint16_t)’:
/home/yuksel/Downloads/liblas/src/header.cpp:613:69: error: ‘1’ was not declared in this scope
boost::bind( &SameVLRs, name, id, 1 ) ),
^
/home/yuksel/Downloads/liblas/src/header.cpp:613:69: note: suggested alternatives:
In file included from /usr/local/include/boost/mpl/aux
/include_preprocessed.hpp:37:0,
from /usr/local/include/boost/mpl/placeholders.hpp:43,
from /usr/local/include/boost/mpl/apply.hpp:24,
from /usr/local/include/boost/mpl/aux
/iter_apply.hpp:17,
from /usr/local/include/boost/mpl/aux_/find_if_pred.hpp:14,
from /usr/local/include/boost/mpl/find_if.hpp:17,
from /usr/local/include/boost/mpl/find.hpp:17,
from /usr/local/include/boost/mpl/aux_/contains_impl.hpp:20,
from /usr/local/include/boost/mpl/contains.hpp:20,
from /usr/local/include/boost/multi_index_container.hpp:26,
from /home/yuksel/Downloads/liblas/include/liblas/external/property_tree/ptree.hpp:21,
from /home/yuksel/Downloads/liblas/include/liblas/schema.hpp:46,
from /home/yuksel/Downloads/liblas/include/liblas/point.hpp:47,
from /home/yuksel/Downloads/liblas/include/liblas/bounds.hpp:46,
from /home/yuksel/Downloads/liblas/include/liblas/header.hpp:47,
from /home/yuksel/Downloads/liblas/src/header.cpp:43:
/usr/local/include/boost/mpl/aux_/preprocessed/gcc/placeholders.hpp:29:16: note: ‘mpl_::1’
typedef arg<1> 1;
^
/usr/local/include/boost/mpl/aux
/preprocessed/gcc/placeholders.hpp:29:16: note: ‘mpl
::1’
In file included from /usr/local/include/boost/bind/bind.hpp:2356:0,
from /usr/local/include/boost/multi_index/sequenced_index.hpp:17,
from /home/yuksel/Downloads/liblas/include/liblas/external/property_tree/ptree.hpp:23,
from /home/yuksel/Downloads/liblas/include/liblas/schema.hpp:46,
from /home/yuksel/Downloads/liblas/include/liblas/point.hpp:47,
from /home/yuksel/Downloads/liblas/include/liblas/bounds.hpp:46,
from /home/yuksel/Downloads/liblas/include/liblas/header.hpp:47,
from /home/yuksel/Downloads/liblas/src/header.cpp:43:
/usr/local/include/boost/bind/placeholders.hpp:46:38: note: ‘boost::placeholders::1’
BOOST_STATIC_CONSTEXPR boost::arg<1> 1;
^
In file included from /usr/local/include/boost/lambda/lambda.hpp:14:0,
from /home/yuksel/Downloads/liblas/src/header.cpp:56:
/usr/local/include/boost/lambda/core.hpp:71:60: note: ‘boost::lambda::{anonymous}::1’
boost::lambda::placeholder1_type& BOOST_ATTRIBUTE_UNUSED 1 = free1;
^
/usr/local/include/boost/lambda/core.hpp:71:60: note: ‘boost::lambda::{anonymous}::1’
In file included from /usr/local/include/boost/mpl/aux
/include_preprocessed.hpp:37:0,
from /usr/local/include/boost/mpl/placeholders.hpp:43,
from /usr/local/include/boost/mpl/apply.hpp:24,
from /usr/local/include/boost/mpl/aux
/iter_apply.hpp:17,
from /usr/local/include/boost/mpl/aux
/find_if_pred.hpp:14,
from /usr/local/include/boost/mpl/find_if.hpp:17,
from /usr/local/include/boost/mpl/find.hpp:17,
from /usr/local/include/boost/mpl/aux
/contains_impl.hpp:20,
from /usr/local/include/boost/mpl/contains.hpp:20,
from /usr/local/include/boost/multi_index_container.hpp:26,
from /home/yuksel/Downloads/liblas/include/liblas/external/property_tree/ptree.hpp:21,
from /home/yuksel/Downloads/liblas/include/liblas/schema.hpp:46,
from /home/yuksel/Downloads/liblas/include/liblas/point.hpp:47,
from /home/yuksel/Downloads/liblas/include/liblas/bounds.hpp:46,
from /home/yuksel/Downloads/liblas/include/liblas/header.hpp:47,
from /home/yuksel/Downloads/liblas/src/header.cpp:43:
/usr/local/include/boost/mpl/aux
/preprocessed/gcc/placeholders.hpp:29:16: note: ‘mpl
::_1’
typedef arg<1> _1;
^
src/CMakeFiles/las.dir/build.make:199: recipe for target ‘src/CMakeFiles/las.dir/header.cpp.o’ failed
make[2]: *** [src/CMakeFiles/las.dir/header.cpp.o] Error 1
CMakeFiles/Makefile2:273: recipe for target ‘src/CMakeFiles/las.dir/all’ failed
make[1]: *** [src/CMakeFiles/las.dir/all] Error 2
Makefile:182: recipe for target ‘all’ failed
make: *** [all] Error 2
源码作者也给出了相应的解决方法:
在这里插入图片描述
但是需要注意的是,你修改了这个地方之后还会报错,因为在代码的其他地方编译错误也是这个原因引起的,你还需要自己查看错误,分析是哪出错需要加上上面两句代码。

3 编译使用库存在的问题

这个由于我是第一次实际要用到动态连接库,之前对编译过程也知道,但实际应用还是出现了问题
比如我运行以下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <iostream>
#include <fstream>
#include <string>
#include <liblas/liblas.hpp>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>

using namespace std;
using namespace liblas;

int main()
{
    //确定las文件输入路径以及pcd文件输出路径
    //const char* lasfile = "data.las";
    string lasfile = "data.las";
    //string lasfile = "data.las"
    //const char* pcdfile = "out_data.pcd";
    string pcdfile = "out_data.pcd";
    std::ifstream ifs;
    ifs.open(lasfile, std::ios::in | std::ios::binary);
    //liblas::ReaderFactory f;
    ReaderFactory f;
    Reader reader = f.CreateWithStream(ifs);
    //liblas::Reader reader = f.CreateWithStream(ifs);
    //liblas::Header const& header = reader.GetHeader();
    //liblas::Header header = reader.GetHeader();
    Header header = reader.GetHeader();
    pcl::PointCloud<pcl::PointXYZ>::Ptr pointCloudPtr(new pcl::PointCloud<pcl::PointXYZ>);
    int count = header.GetPointRecordsCount();
    pointCloudPtr->resize(count);
    pointCloudPtr->width = 1;
    pointCloudPtr->height = count;
    pointCloudPtr->is_dense = false;

    int i = 0;
    while (reader.ReadNextPoint())
    {
        //liblas::Point const& p = reader.GetPoint();
        //liblas::Point p = reader.GetPoint();
        Point p = reader.GetPoint();
        //pointCloudPtr->points[i].x = p.GetX();
        pointCloudPtr->points[i].x = p.GetX();
        pointCloudPtr->points[i].y = p.GetY();
        pointCloudPtr->points[i].z = p.GetZ();
        ++i;
    }
    pcl::io::savePCDFileASCII(pcdfile,*pointCloudPtr);
    return 0;
}

出现了未定义引用错误 undefined reference to 某某函数,这个问题就是动态链接库没引进去,一般来说你安装好的liblas、boost、pcl库都在/usr/local/include或/usr/include/下面可以找到头文件,可以在相应的lib中找到动态链接库文件,我最后解决方法是这样的:
在这里插入图片描述
解决了库找不到的问题,由于动态库就在系统的include目录中,因此直接用-l命令引入就好,在lib中,比如说我用到了liblas.so.3这个动态连接库,那么编译的时候加-llas就好, 去掉lib和后面的.so