LAStools 配置方法、遇到的問題及其呼叫
阿新 • • 發佈:2018-12-18
說明
- 雖然網上有很多編譯 LASTools 的教程,但是這些部落格或多或少都有些問題,現將我自己的配配置經驗分享出來,方便後來人使用
- 如果有任何問題,請與博主聯絡
libLAS 、LAStools 和 LASlib 的關係
- libLAS 和 LAStools 是兩個不一樣的庫,LAStools 是一個大學教授維護的 ,libLAS 是一個工程師維護的
- LAStools 裡面包含有 LASlib ,所以就把 libLAS 給幹掉了,所以 libLAS 不維護了,被淘汰了**
- libLAS 自己官網都說了直接用 LAStools了
- 但是 libLAS 不服 LAStools ,索性就發起了 pdal 準備幹掉 LAStools
配置過程
1. 下載 LAStools
不要在 Github 上下載,下載的貌似不能用
2. 解壓
- 解壓至 D:\
路徑儘量不要帶中文和空格
3. 用 VS 編譯 LAStools
- 用 VS2013 開啟 D:\LAStools\lastools.dsw
其實這裡用 VS 哪個版本都無所謂,相差無幾
-
出現複查專案和解決方案更改,直接確定
-
XXXX.XXX 已損壞無法開啟,直接確定若干次
-
選中載入失敗的工程,右鍵移除(DEL)
-
修改 LASlib 的屬性,配置全部修改成 Release ,平臺全部修改成 x64
-
C/C++ -> 常規 -> 附加包含目錄下 刪除 …las\zip\stl
有的教程說還要新增預編譯器,經測試,沒必要新增,新增後會報錯
- 修改 LASlib -> Header Files ->mydefs.hpp 的內容,見下程式碼(約程式碼 69-73行):
行數只是個大概,找自己的即可,有的可能顯示的不是 #if defined(_MSC_VER) || defined (MINGW32),沒什麼關係,只留下#if defined(_MSC_VER)即可
修改前
#if defined(_MSC_VER) || defined (__MINGW32__)
typedef int BOOL;
#else
typedef bool BOOL;
#endif
修改後
#if defined(_MSC_VER) // || defined (__MINGW32__)
typedef int BOOL;
#else
typedef bool BOOL;
#endif
有的部落格說把這部分全部註釋掉,改成
typedef int Bool
經測試,這樣改並不正確
- 右鍵 LASlib 清理,然後重新生成完成編譯,正常情況下編譯成功,報錯請轉到編譯錯誤及解決辦法
編譯錯誤及解決辦法
- 錯誤 35 error C2660: “LASindex::seek_next”: 函式不接受 1 個參
- 是否自己在預編譯器裡添加了其他檔案
- …
測試用例
- 新建工程 TestLasTools
- 屬性管理器 Release | x64 下新建屬性表
- 設定屬性表:
- VC++目錄 -> 包含目錄:D:\LAStools\LASzip\src 和 D:\LAStools\LASlib\inc
- VC++目錄 -> 庫目錄:D:\LAStools\LASlib\lib
- 連結器 -> 輸入 -> 附加依賴項:LASlib.lib
- 快速設定鍵下方
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ImportGroup Label="PropertySheets" />
<PropertyGroup Label="UserMacros" />
<PropertyGroup>
<IncludePath>D:\LAStools\LASzip\src;D:\LAStools\LASlib\inc;$(IncludePath)</IncludePath>
<LibraryPath>D:\LAStools\LASlib\lib;$(LibraryPath)</LibraryPath>
</PropertyGroup>
<ItemDefinitionGroup>
<Link>
<AdditionalDependencies>LASlib.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
<ItemGroup />
</Project>
- 新建 main.cpp 檔案
#include <iostream>
#include "lasreader.hpp"
void foo(){
//laslib只允許'\\'格式的檔案路徑。
std::string lasFile("E:\\xt.las"); //替換成自己的路徑
//開啟las檔案
LASreadOpener lasreadopener;
lasreadopener.set_file_name(lasFile.c_str());
LASreader* lasreader = lasreadopener.open();
//size_t count = lasreader->header.number_of_point_records;
int loop_time = 0;
while (lasreader->read_point() && loop_time < 10) //只讓輸出前 10 行座標
{
std::cout << lasreader->point.get_x() << " "
<< lasreader->point.get_y() << " "
<< lasreader->point.get_z() << std::endl;
loop_time++;
}
lasreader->close();
delete lasreader;
}
int main(){
foo();
return 0;
}
- 執行看是否成功,失敗的話請看下面
呼叫庫失敗原因及其詳解
- error LNK2038: 檢測到“RuntimeLibrary”的不匹配項: 值“MDd_DynamicDebug”不匹配值“MTd_StaticDebug”
- 右鍵 工程 -> 屬性 -> C/C++ -> 程式碼生成 -> 執行庫 改成多執行緒(/MT)
- 詳情請見
- 待補充
- …