装这两个库真的是要吐了, 本文不教装环境,仅仅记录本人在装环境过程中出现的关键问题
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