1. 程式人生 > >LAStools 配置方法、遇到的問題及其呼叫

LAStools 配置方法、遇到的問題及其呼叫

說明

  • 雖然網上有很多編譯 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 清理,然後重新生成完成編譯,正常情況下編譯成功,報錯請轉到編譯錯誤及解決辦法

編譯錯誤及解決辦法

  1. 錯誤 35 error C2660: “LASindex::seek_next”: 函式不接受 1 個參
  • 是否自己在預編譯器裡添加了其他檔案

測試用例

  • 新建工程 TestLasTools
  • 屬性管理器 Release | x64 下新建屬性表
  • 設定屬性表:
    • VC++目錄 -> 包含目錄:D:\LAStools\LASzip\srcD:\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;
}
  • 執行看是否成功,失敗的話請看下面

呼叫庫失敗原因及其詳解

  1. error LNK2038: 檢測到“RuntimeLibrary”的不匹配項: 值“MDd_DynamicDebug”不匹配值“MTd_StaticDebug”
  • 右鍵 工程 -> 屬性 -> C/C++ -> 程式碼生成 -> 執行庫 改成多執行緒(/MT)
  • 詳情請見
  1. 待補充

參考部落格

聯絡作者

郵箱:[email protected]