VS2013_WIN64_LIBLAS_编译记录
libLAS 是一个用来读写三维激光雷达数据(LiDAR) 的 C++ 库。在学习、科研和研发中都会广泛运用。
笔者在Win7 64位系统、CMake和VS2013编译libLAS库,在编译过程中走了一些弯路和遇到了不好问题,终于一一解决。现以博客的形式记录下来。供相关研究的同仁学习交流。
OSGeo4W也可以编译,但是感觉出来的库太臃肿了
编译前的准备:下载库
编译libLAS库还须要Boost、GDAL、TIFF和GeoTIFF四个库的支持,所以在编译libLAS前须要将所需的各个库进行下载和编译。
由于笔者电脑中已经配置了PCL库,当中包括Boost库,故在此就不单独配置Boost。
libLAS库下载:libLAS-1.8.0
GDAL库下载:gdal1110
LibTiff库下载:tiff-3.8.2
Libgeotiff 库下载:libgeotiff-1.2.5
网上有说编译libLAS库不须要GDAL、LibTIFF和Liggeotiff库的,在实际用Cmake编译时。提示须要GDAL、LibTIFF和Libgeotiff库,这三个库之间分别在各自的基础上作为其它库支撑。因此这三个库都须要编译并配置。
编译GDAL
先解压文件,打开cmd设置VS2013 64位编译环境工具,在cmd窗体中键入:cd /d E:\CPlusPlusLib\gdal-1.11.0 ,在此之前需要修改参数信息,打开文件夹E:\CPlusPlusLib\gdal-1.11.0下的namke.opt进行例如以下三个位置的改动。分别作用是配置vs2013编译器,系统位数和安装位置。
依次键入:
nmake /f makefile.vc
nmake /f makefile.vc install
nmake /f makefile.vc devinstall
编译成功
编译Tiff库
首先需要添加jepg的支持
如今打开文件夹:E:\CPlusPlusLib\tiff-3.8.2\libtiff中tiffconf.h.vc进行改动,把当中的 /* #undef JPEG_SUPPORT /,/ #undef OJPEG_SUPPORT*/ 中的凝视去掉。再删掉 E:\CPlusPlusLib\tiff-3.8.2\libtiff下的全部 .obj 文件。
打开cmd,打开cmd设置VS2013 64位编译环境工具,在cmd中分别键入:
cd /d E:\CPlusPlusLib\tiff-3.8.2
依次键入:
nmake /f makefile.vc
nmake /f makefile.vc install
nmake /f makefile.vc devinstall
编译成功会在E:\CPlusPlusLib\tiff-3.8.2\libtiff下生成对应的lib和dll文件
编译LIBGEOTIFF库
解压,组织一下文件夹,组织成下图的格式,把上一步编译的结果(E:\CPlusPlusLib\tiff-3.8.2\libtiff)所有文件全部拷贝到对应目录下
打开cmd,打开cmd设置VS2013 64位编译环境工具,在cmd中分别键入:
cd /d E:\CPlusPlusLib\tiff-3.8.2
依次键入:
nmake /f makefile.vc
nmake /f makefile.vc install
nmake /f makefile.vc devinstall
编译成功:
编译LIBLAS库
解压libLAS-1.8.0.tar.bz2,打开cmake,输入输出目录保持一致,一定要选择带win64的,之前白白编译一遍
修改的内容如下:
编译生成即可
编译成功后,会在目录下生成工程文件,打开工程文件,直接生成即可
编译成功的结果,用liblas.lib和liblas.dll即可
Windows下的库调用
使用的时候,全部使用临时目录
//libLAS
#include "liblas\liblas.hpp"
/* read las */
int main()
{
std::ifstream ifs;
ifs.open("D:\\TEST.las", std::ios::in | std::ios::binary);
liblas::ReaderFactory factory;
liblas::Reader xjReader = factory.CreateWithStream(ifs);
liblas::Header const& xjHeader = xjReader.GetHeader();
//count
int pCount = xjHeader.GetPointRecordsCount();
//range
double maxX = xjHeader.GetMaxX();
double minX = xjHeader.GetMinX();
double maxY = xjHeader.GetMaxY();
double minY = xjHeader.GetMinY();
double maxZ = xjHeader.GetMaxZ();
double minZ = xjHeader.GetMinZ();
double delatX = maxX - minX;
double delatY = maxY - minY;
double delatZ = maxZ - minZ;
return 0;
}