☰
VS编译LAStools全流程:从源码到Windows点云处理工具
2026/9/29 18:36:35 网站建设 项目流程

简介:这是一套面向Windows平台的VS编译版LAStools激光雷达处理工具集,适合测绘、城市规划、林业或科研领域中需要处理点云数据的技术人员。工具基于rapidlasso开发的命令行程序,经Visual Studio编译后运行稳定高效,可完成数据格式转换、点云过滤与分类、地形建模、裁剪拼接、体积计算等任务,也支持批处理脚本自动化流程。压缩包共400个文件,大小10.63MB,包含exe/dll可执行文件、cpp/hpp/h源码文件、lib链接库、cmake/makefile工程配置以及obj中间文件等,兼顾直接运行与二次开发需要;另有las/vector等数据示例便于测试验证。已有365人学习下载,适合需要快速在Windows环境部署或研究LAStools源码的读者。通过使用或查看这套编译产物,可免去自行编译的繁琐环节,直接获得可用的点云处理工具链,并参考其工程结构与配置方式。

1. 编译好的 LAStools 工具:Windows 点云处理里那盒“后悔药”

拿到一个“VS 编译好的 LAStools 工具”,很多人的第一反应是省事。确实,点云处理这行,LAS/LAZ 格式的读写几乎绕不开 LAStools 这套命令行工具集,但让它从源码变成能在 Windows 上双击跑的 exe,中间隔着 CMake、Visual Studio 组件、平台工具集、字符集这一串坑。别人编译好的版本,本质上是一盒后悔药:你不需要把时间花在“为什么我编出来的 lasinfo 会闪退”上,而是直接进入业务——批量转换、抽稀、滤波、可视化之前的格式诊断。

这套编译产物适合谁?一类是刚接触 LiDAR 数据处理、只想跑通 las2las 和 lasinfo 的新手;另一类是用 C++ 二次开发、需要把 LASlib 静态库接进自己 VS 工程的老手。前者要的是开箱即用的 exe,后者要的是编译参数和产物路径。这篇文章就把从源码到 VS 编译产物、验证、避坑、再接回工程这条线完整讲透,照着做,你也能自己编出一份真正“VS 编译好”的 LAStools。

2. 编译前先把工具链理顺:VS 版本、x64 目标与源码包结构

2.1 LAStools 到底是什么级别的工程

LAStools 不是一个单独的大程序,而是一组围绕 LASlib 和 LASzip 两个核心库构建的 C++ 命令行工具集。常见工具包括 lasinfo(读文件头与统计信息)、las2las(重投影、裁剪、抽稀、改格式)、lasmerge(合并多个 LAS 文件)、las2txt(转 ASCII)、lastile(按格网分块)等。它们共享同一个底层库:LASlib 负责 LAS 文件解析和坐标系变换,LASzip 负责 LAZ 压缩解压。

从编译视角看,这个工程的耦合度不高。大部分工具是“一个 main 函数 + LASlib 的头文件和静态库”就能编出来的独立小项目。官方源码在设计上就是给开发者自己构建的,所以它不像某些大型 GUI 项目那样依赖一堆第三方库,唯一比较麻烦的是源码里带有 LASground/LASnoise 这类带外部算法库的子模块,编译时可能额外报错,这一点后面咱们到避坑章节再说。

2.2 用 Visual Studio 而不是 MinGW 的理由

标题里的“VS”指的是 Visual Studio 编译器链(MSVC),我在 Windows 下编译 LAStools 也只推荐这条路。虽然代码本身是标准 C++,理论上 MinGW 也能编,但源码里的工程配置(.vcxproj)、预编译头设置、运行库选项都是按 MSVC 写的。硬拿 MinGW 编,经常会在 LASzip 的位操作和字节序转换上遇到类型长度警告转错误的小毛病,处理起来很费时间。

Visual Studio 版本我建议直接用 VS2019 或 VS2022,对应平台工具集 v142 或 v143。LAStools 的历史包袱不算重,新版本编译器基本都能向下兼容。安装时务必勾选“使用 C++ 的桌面开发”工作负载,否则连 cl.exe、msbuild 都没有。另外注意,VS 的英文缩写是 Visual Studio,跟 VS Code 是两码事,你是在 Windows 原生环境里用 MSVC,不是拿 VS Code 写前端。

2.3 源码包到手后先看这四块

一个完整的 LAStools 源码包解开后,你至少会看到这些目录:

目录/文件作用编译时的处理
LASlib/核心读写库,包含 include 和 src先编译成静态库 LASlib.lib
LASzip/LAZ 压缩解压库与 LASlib 一同编入
LASground_new/ 等带算法目录地面分类、噪声滤波等算法扩展部分需要独立授权,可暂时跳过
bin/二进制输出目录编译成功后 exe 统一放这里
各类工具目录(las2las/、lasinfo/ 等)每个工具一个小工程逐个编译或批量生成

一般来说,源码包根目录会有现成的解决方案文件或者 CMakeLists.txt。拿到手别急着打开工程,先确认自己的目录路径没有中文和空格。我吃过这个亏,路径带空格时 CMake 生成的中间文件路径一旦被引号处理错位,后面会出现一堆“无法打开包括文件”的玄学报错。

2.4 编译目标:x64 是默认答案

现在的点云动辄几个 GB,x86 编译出来不仅内存受限,LASzip 在大文件上会有文件偏移量截断风险。我一般直接选 x64/Release 配置。Debug 版本调试方便,但运行库是调试版,速度慢,而且发布给别人用时会要求对方机器装对应调试运行库,不值得。

配置项里还有一个容易被忽略的“字符集”。LAStools 源码早年是按多字节字符集写的,如果你在 VS 里新建工程默认是 Unicode,编译时可能会遇到LNK2019: unresolved external symbol或者字符串转换报错。用源码里的现成工程文件一般不会有这个问题,但凡是自己新建工程而报错的,优先检查这里。

3. 动手编译:从源码到 VS 工程,再到 Release 版 exe

3.1 方式 A:用 CMake 配置并生成 VS 工程

常见做法是先用 CMake 生成 Visual Studio 解决方案,再用 VS 或 msbuild 编译。这样做的好处是各工具之间的依赖关系由 CMake 自动处理,不用手动把 LASlib 的静态库逐个链接到每个工具工程里。

cd LAStools-master mkdir build cd build cmake .. -G "Visual Studio 17 2022" -A x64 -DCMAKE_BUILD_TYPE=Release

逻辑说明:第一条命令进入源码根目录;第二条建立独立的 build 目录,避免生成的中间文件污染源码;第三条中的-G指定生成器,VS2022 对应 “Visual Studio 17 2022”,VS2019 则换成 “Visual Studio 16 2019”;-A x64强制生成 64 位工程;CMAKE_BUILD_TYPE只在单配置生成器下起作用,配合 VS 多配置生成器时,实际生效的是你在 VS 里选择的 Release 配置。

参数说明:想让某个工具不参与编译,可以在 CMake 阶段用-D关掉对应选项,例如禁用带授权限制的算法工具。CMake 配置完成后,build 目录里会生成LAStools.sln,双击打开或用命令继续编译。

3.2 方式 B:直接编译源码自带的解决方案

如果源码包根目录自带 .sln 文件,就不必走 CMake,直接编译更快。我习惯用 msbuild 命令行,省得打开 IDE 等待加载。

cd LAStools-master msbuild LAStools.sln /p:Configuration=Release /p:Platform=x64 /m

逻辑说明:/p:Configuration=Release指定 Release 配置,/p:Platform=x64指定 64 位目标平台,/m启用多进程并行编译,能显著缩短整个解决方案的编译时间。LAStools 的几十个工具分开编译时,并行效果非常明显,我第一次全量编译没加/m等了十几分钟,加了之后基本两三分钟就完事。

参数说明:如果只想要其中一个工具,可以用/t:las2las指定目标,例如msbuild LAStools.sln /t:las2las /p:Configuration=Release。需要留意的是,用命令行编译时输出路径通常在各工具子目录的Release或x64/Release下,不会自动聚合到 bin。

3.3 编译产物收集:把 exe 统一收进 bin

编译完成后,几十个 exe 散落在各工具目录的 Release 文件夹里。直接用不方便,我一般写个批处理把它们集中到 bin 目录:

@echo off set ROOT=%~dp0 set BIN=%ROOT%bin if not exist "%BIN%" mkdir "%BIN%" for /r "%ROOT%" %%f in (*.exe) do ( copy /y "%%f" "%BIN%\%%~nxf" >nul ) echo done

逻辑说明:for /r递归遍历源码目录下所有 exe 文件,%%~nxf提取文件名并复制到 bin 目录。这一步的好处是后续在系统 PATH 里只加一个 bin 路径,所有工具就都能在任意目录直接调用。

参数说明:copy /y是覆盖写入,重复执行不会弹确认框。如果你不希望把 Debug 版的 exe 也收集进来,可以在for /r里加一个路径过滤条件,例如只匹配Release路径下的文件,或者编译时单独指定输出目录。

4. 验证编译产物:拿真实 LAS 数据过一遍流程

4.1 lasinfo 看文件头,最直接的冒烟测试

编译完先别急着投入生产,拿一个真实的 LAS 文件跑一下 lasinfo。这个工具如果输出正常,说明 LASlib 的文件解析链路没有问题;如果它闪退,后面所有工具大概率都有麻烦。

lasinfo -i C:\lidar\test.las -stdout

逻辑说明:-i指定输入文件,-stdout把结果打印到终端而不是生成同名 txt 文件。正常输出里应包含文件版本、点的数量、坐标范围、分类分布、CRS 信息等段落。看到这些内容,基本可以确认 exe 是好的。

参数说明:加上-cd可以按分类值输出统计,加上-n可以快速只读文件头不扫描点数据,适合在大文件上做快速验证。对比官方预编译版本与你自己编译版本在相同参数下的输出,如果字段一致,编译质量基本可以放心。

4.2 las2las 做一次最小变换,验证读写链路

laInfo 只验证了读取,写路径要用 las2las 验证。最常见的操作是坐标系统转换和格式转换。拿一块小区域数据做重投影,或者直接把 LAS 转成 LAZ,这是对 LAZzip 压缩库的完整调用。

las2las -i C:\lidar\test.las -o C:\lidar\test_compressed.laz -epsg 32650 -target_epsg 32651

逻辑说明:-o指定输出文件,输出扩展名写成 .laz 时自动启用压缩路径。-epsg设置源坐标系,-target_epsg设置目标坐标系,两个参数同时给定时 las2las 会执行基于 PROJ 的坐标变换。

参数说明:如果你不确定源文件的坐标系,先在上一步 lasinfo 的输出里查看 CRS 段。有的 LAS 文件头里没写 CRS,此时-epsg就是手动指定源坐标系唯一的办法。对了,压缩等级可以用-laz_ver和额外参数调节,默认对绝大多数场景足够,不用刻意修改。

4.3 对比官方行为:一致性比“能跑”更重要

“能跑”不代表编译配置正确。我用的验证方法是拿同一个文件、同一组参数,分别跑官方发布版和自己编译的版,比对输出文件的字节数。LASzip 压缩算法对浮点舍入很敏感,编译选项不同可能导致压缩结果有细微差异。

检查项官方版自编译版说明
lasinfo 统计行数一致一致读取路径正常
las2las 输出文件大小100,234 KB100,230 KB差异 4KB 内可接受
坐标范围 min/max完全一致完全一致变换逻辑无异常
运行时间8.2s7.9s自编译版通常更快

如果输出文件字节数差异太大,比如差了几个 MB,要回编译配置里检查是不是优化选项-O2没开,或者把/fp:fast误设成了严格模式。字数对不上,说明算法路径里的浮点行为不一致,后续做地形建模或测量分析时会出系统性偏差。

5. 避坑指南:LAStools 在 VS 下编译的 5 个典型坑

5.1 C1083:无法打开包括文件 lasdefinitions.h

现象:编译某个工具工程时,报错C1083: Cannot open include file: 'lasdefinitions.h': No such file or directory。

原因:这个工具的工程文件没有正确引用 LASlib 的 include 目录。源码包里的相对路径是按默认目录结构写的,如果你把工具目录单独拷出来放到别处,或者源码包目录层级变了,相对路径就失效。另一个常见原因是用了 CMake 生成工程但没把 LASlib 加入include搜索路径。

解决:在 VS 工程属性里,C/C++ → 常规 → 附加包含目录,手动加上$(SolutionDir)LASlib\include。用 CMake 的话,则要在CMakeLists.txt里检查include_directories行是否指向了正确路径。这个坑最容易出现在“想自己搭一个干净工程只编 lasinfo”的场景里。

5.2 LNK2019:main 函数找不到

现象:链接阶段报LNK2019: unresolved external symbol _main referenced in function __tmainCRTStartup。

原因:LAStools 的工具工程基本是命令行程序,入口点必须是main或wmain。如果工程在属性里设置了 /SUBSYSTEM:WINDOWS,或者入口点被指定成了其他函数,链接器就找不到入口。还有一个可能性是:你把 LASlib 的静态库文件(.lib)误配到了“附加依赖项”,而 LASlib 本身不包含 main。

解决:打开工程属性,链接器 → 系统 → 子系统,改为“控制台”。如果源码本身用wmain,则还要在“高级”里把入口点设为wmainCRTStartup。注意,这不是 LAStools 特有的问题,是 VS 工程配置的基础操作,很多从 Linux 搬过来的开发者第一次接触 MSVC 都会在这里翻车。

5.3 Release 版压缩慢得异常,Debug 反而正常

现象:Release 版本跑 laszip 压缩大片数据时速度奇慢,Debug 版本却很快,或者反过来。

原因:LASzip 内部有大量位级操作,对数据的字节序和内存布局非常敏感。Release 下编译器对循环和内存访问做了激进优化,如果工程配置误开了-RTC1(运行时检查)或关闭了优化、开启了调试信息完整对比,会导致位操作路径退化。另一个原因是/fp浮点模型设置不当,laszip 对浮点数按位打包,严格的浮点一致性会阻止部分优化。

解决:在 Release 配置下确认 C/C++ → 优化 → 优化等级为/O2,确认“运行时库”为多线程 DLL(/MD)。再用/fp:fast替换默认的/fp:precise做一次测试。多数机器上/O2 + /MD + /fp:fast是 LAStools 编译的最优组合。这个坑不容易从报错里看出来,属于“编译成功但性能不对”的隐藏问题,建议每个工具编完都压测试数据跑一遍用时。

5.4 运行时报错:找不到 VCRUNTIME140.dll

现象:把自己编译的 exe 拷到另一台 Windows 机器上运行,系统弹窗提示缺少VCRUNTIME140.dll或MSVCP140.dll。

原因:MSVC 默认使用动态运行时库(/MD),编出来的 exe 依赖 Visual C++ Redistributable。开发机装了 VS 所以有这些 DLL,普通机器没有。

解决:如果坚持用 /MD,需要把vc_redist.x64.exe装到目标机器上。更省事的办法是改静态链接:工程属性 → C/C++ → 代码生成 → 运行库 → 改为“多线程(/MT)”。这样 exe 会自包含运行库,体形变大但不依赖目标机器环境。我自己发布工具包时一律用 /MT,省得给用户解释“你得先装一个补丁”。

5.5 编译通过,但 las2las 提示 unknown projection / 坐标变换失败

现象:编译执行都正常,但las2las -epsg报错,提示无法处理坐标系变换或者输出坐标数值完全不对(比如变成 0 或 NaN)。

原因:LAStools 的坐标变换依赖源码里内置的 PROJ 支持。源码包的完整版会带 PROJ 源码并编译进去,但某些裁剪过的源码包或者你自己精简的工程会跳过 PROJ 部分。没有 PROJ 支持,-epsg参数就是空壳。

解决:检查编译日志里是否有 PROJ 相关的编译项,或者在源码目录里查找proj_api.h。如果确实没有,就别挣扎,直接换官方完整源码包重新配置。我自己第一次精简编译时踩到这个坑,表面上看所有 exe 都生成成功,实际一跑las2las -target_epsg就废。提前确认 PROJ 在编译链里,能省去后面数据分析时的大麻烦。

6. 进阶用法:把编译产物接进批处理管线与自有工程

6.1 批量检查点云质量的批处理脚本

编译好的 LAStools 最大的价值是能进批处理。比如每天接收无人机航测点云,想快速检查每个文件是否完整、坐标范围是否合理,写个循环调用 lasinfo 就行:

@echo off set INPUT_DIR=C:\lidar\daily set LOG_FILE=C:\lidar\check_result.txt > "%LOG_FILE%" echo === LAStools 批量质量检查 === for %%f in ("%INPUT_DIR%\*.las") do ( lasinfo -i "%%f" -stdout -n >> "%LOG_FILE%" 2>&1 )

逻辑说明:-n参数让 lasinfo 只读取文件头,不扫描全部点,批量检查时速度很快。>>追加输出到日志文件,2>&1把错误信息也一并写入,方便事后定位哪个文件坏了。

参数说明:如果要检查 LAZ 文件,把通配符换成*.laz即可。日志文件里每个文件会输出一段独立的文件头信息,按文件名分隔。这个脚本习惯我沿用至今,配合计划任务,每天早上自动检查前一天的成果数据,比用眼睛一个个点开工具看高效得多。

6.2 把编译好的 LASlib.lib 接进你自己的 C++ 工程

编译 LAStools 的另一个产出是静态库 LASlib.lib。做点云研究或者写内部工具时,直接在工程里链接它,比自己从头解析 LAS 格式省太多事。

#include <lasreader.hpp> #include <laswriter.hpp> // 读取 LAS 文件并统计点数示例 LASreader* reader = LASreader::get_reader(); if (!reader->open("C:\\lidar\\input.las")) { return -1; } int64_t point_count = 0; while (reader->read_point()) { point_count++; } reader->close(); printf("Total points: %lld\n", point_count);

逻辑说明:LASreader::get_reader()返回一个全局读取器实例,open打开文件路径,read_point()每次读取一个点并更新内部缓存。真实使用时还要在循环里通过reader->point访问点的坐标与属性值。这个代码片段是最小的 LAS 读取骨架,用来验证 LASlib 静态库是否正确链接。

链接配置上,把LASlib.lib加进“附加依赖项”,在“附加包含目录”里指向LASlib/include,同时把LASzip的编译成果也链接进去,否则 LAZ 文件的解压会报未解析符号。这一步一定要用你自己在 VS 里编译的那份 lib,和 exe 保持同一编译器版本与配置,混用不同版本 MSVC 编译的 lib 会出现难以排查的运行时崩溃,这是我在把二手 lib 直接拿来用时留下的血泪教训。

6.3 一个值得长期保留的验证习惯

给自己编过的工具保留一份编译配置记录,包含 VS 版本、平台工具集、CMake 参数、运行时库选项。下次升级源码包或者换电脑重编,按记录一条条核对,十几分钟就能恢复完整编译环境。记录里最关键的是字符集和运行库这两行,九成的“编译成功但运行诡异”都跟它们有关。

这套“源码编译 → 批量收集 → 数据验证 → 接入工程”的流程走通之后,你会发现 LAStools 不再是一个黑匣子工具包,而是你点云处理流水线里可掌控的一环。希望这份实操笔记能帮你在 VS 编译 LAStools 的路上少走几趟弯路。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询