配置和编译源码
LASlib是进行点云数据读写的理想工具,由北卡计算机学院的Martine isenburg编写。基于该开源库,作者同时开发了LASTool,包含了一系列点云数据处理的工具。LASlib提供了LAS格式的LiDAR点云数据的高效读写接口。因此,对于一些常用的LAS格式的数据操作,LASlib的开源、高效等特性,无疑使其成为一个重要的开发库。
源代码下载地址:http://www.cs.unc.edu/~isenburg/lastools/
- 下载源码后,解压源码到任意目录(最好是全英文的路径)。
- 用VS 2017,打开解压后文件夹中LASlib目录下的LASlib.dsw工程文件。提示需要进行版本升级转换,一直点击确认进行转换。
- 右键点击LASlib工程,在属性对话框中选择配置管理器 按钮,新建x64的配置。同时,设置当前配置为x64。
- 右键点击LASlib工程,在属性对话框 -C/C++ -常规下-附加包含目录中删除带有stl的一项。
- 打开LASlib工程下的头文件mydefs.hpp,定位到69行,只保留 #if defined(_MSC_VER),删除或注释改行其它代码进行如下修改:
#if defined(_MSC_VER)/* || defined (__MINGW32__)*/ typedef int BOOL; #else typedef bool BOOL; #endif
引用博文:https://blog.youkuaiyun.com/u013045316/article/details/51700543。但是该博文中的第四点如下:4) 右键点击LASlib工程,在属性对话框 - C/C++ -预处理器下增加LASZIPDLL_EXPORTS预编译宏。我在预处理器下加了LASZIPDLL_EXPORTS就报错。所以,千万不要增加LASZIPDLL_EXPORTS预编译宏。
-
Win 10系统需要,右键LASlib—属性—配置属性—常规—Windows SDK 版本—选择合适的。
否则可能出现错误:找不到Windows SDK 版本8.1。请安装所需的版本的Windows SDK或者在项目属性页中或通过右键单击解决方案并选择”重定解决方案目标”来更改SDK版本。
第6点引用了原文链接:https://blog.youkuaiyun.com/xinjiang666/article/details/104878678。 -
编译的时候还是会出现“无法打开源文件<stdio.h>”等很多错误,需要重新添加包含目录,参考博客,实际的路径并不一定如博客中所示,我的VS就安装在了D盘,和参考博客不一样,只要找到那个“include”文件夹,其中还包含“stdio.h”等文件的路径就好。我是用everything工具搜索的stdio.h头文件,然后选择自己Window SDK版本下的路径添加。引用博文:https://blog.youkuaiyun.com/xujie126/article/details/80769484。如下所示:
- 可以在属性配置中选择自己编译导出静态库lib还是动态库dll。
- 测试:首先,配置属性—C/C++—常规——附加包含目录,添加 G:\LAStools\LASlib\inc 和 G:\LAStools\LASzip\src。然后,在库目录中添加如下目录:E:\...\LAStools\LASlib\lib。最后,在配置属性—链接器—输入——添加 LASlib.lib。
- 使用LASTools(LASlib)库读写laswen文件的例子,可以下载资源:https://download.youkuaiyun.com/download/jacken123456/12326033。
编译错误及解决办法
(1)错误 35 error C2660: “LASindex::seek_next”: 函数不接受 1 个参数。
解决办法:将自己在预编译器里添加的LASZIPDLL_EXPORTS去掉。
(2)错误 copy/Release/Laslib.lib lib/Laslib.lib。
解决办法:检查是否选的是生成 dll,是的话,在后处理事件中删除掉这句话。
其它需要注意的重点:
(1)如果在配置属性常规下面选择了配置类型为动态库DLL没有产生对应的动态库lib,需要修改头文件mydefs.hpp。
//将mydefs.hpp中开头的下面几行注释
//#ifndef _WIN32
//#define LASLIB_DLL
//#else // _WIN32
//#ifdef COMPILE_AS_DLL
//#define LASLIB_DLL __declspec(dllexport)
//#elif USE_AS_DLL
//#define LASLIB_DLL __declspec(dllimport)
//#else
//#define LASLIB_DLL
//#endif
//#endif // _WIN32
//将上面的替换为下面代码导出lib
#define LASLIB_LIBRARY
#ifdef LASLIB_LIBRARY
#define LASLIB_DLL __declspec(dllexport)
#else
#define LASLIB_DLL __declspec(dllimport)
#endif
(2)建议将属性页-C/C++-代码生成中的运行库改为多线程DLL(/MD)。关于MD和MT的详细介绍,可以自行百度。
(3)该配置编译的步骤主要参考了网上的一些博文。最后发现,编译出来的静态库是可以正常读写的,但是编译出来的动态库使用不了,因为没有导出LASzip。 而LASlib的动态库依赖于LASzip,不知道是不是没有开放LASzip?了解的同学欢迎在下方留言,谢谢。