VS2017+win10編譯LASlib(LASTools)庫

配置和編譯源碼    

       LASlib是進行點雲數據讀寫的理想工具,由北卡計算機學院的Martine isenburg編寫。基於該開源庫,作者同時開發了LASTool,包含了一系列點雲數據處理的工具。LASlib提供了LAS格式的LiDAR點雲數據的高效讀寫接口。因此,對於一些常用的LAS格式的數據操作,LASlib的開源、高效等特性,無疑使其成爲一個重要的開發庫。

源代碼下載地址:http://www.cs.unc.edu/~isenburg/lastools/ 

  1. 下載源碼後,解壓源碼到任意目錄(最好是全英文的路徑)。
  2. 用VS 2017,打開解壓後文件夾中LASlib目錄下的LASlib.dsw工程文件。提示需要進行版本升級轉換,一直點擊確認進行轉換。
  3. 右鍵點擊LASlib工程,在屬性對話框中選擇配置管理器 按鈕,新建x64的配置。同時,設置當前配置爲x64。 
  4. 右鍵點擊LASlib工程,在屬性對話框 -C/C++ -常規下-附加包含目錄中刪除帶有stl的一項。
  5. 打開LASlib工程下的頭文件mydefs.hpp,定位到69行,只保留 #if defined(_MSC_VER),刪除或註釋改行其它代碼進行如下修改:
    #if defined(_MSC_VER)/* || defined (__MINGW32__)*/
    typedef int                BOOL;
    #else
    typedef bool               BOOL;
    #endif
    

    引用博文:https://blog.csdn.net/u013045316/article/details/51700543。但是該博文中的第四點如下:4) 右鍵點擊LASlib工程,在屬性對話框 - C/C++ -預處理器下增加LASZIPDLL_EXPORTS預編譯宏。我在預處理器下加了LASZIPDLL_EXPORTS就報錯。所以,千萬不要增加LASZIPDLL_EXPORTS預編譯宏。

  6. Win 10系統需要,右鍵LASlib—屬性—配置屬性—常規—Windows SDK 版本—選擇合適的。

    否則可能出現錯誤:找不到Windows SDK 版本8.1。請安裝所需的版本的Windows SDK或者在項目屬性頁中或通過右鍵單擊解決方案並選擇”重定解決方案目標”來更改SDK版本。
    第6點引用了原文鏈接:https://blog.csdn.net/xinjiang666/article/details/104878678

  7. 編譯的時候還是會出現“無法打開源文件<stdio.h>”等很多錯誤,需要重新添加包含目錄,參考博客,實際的路徑並不一定如博客中所示,我的VS就安裝在了D盤,和參考博客不一樣,只要找到那個“include”文件夾,其中還包含“stdio.h”等文件的路徑就好。我是用everything工具搜索的stdio.h頭文件,然後選擇自己Window SDK版本下的路徑添加。引用博文:https://blog.csdn.net/xujie126/article/details/80769484。如下所示:

  8. 可以在屬性配置中選擇自己編譯導出靜態庫lib還是動態庫dll。
  9. 測試:首先,配置屬性—C/C++—常規——附加包含目錄,添加 G:\LAStools\LASlib\inc 和 G:\LAStools\LASzip\src。然後,在庫目錄中添加如下目錄:E:\...\LAStools\LASlib\lib。最後,在配置屬性—鏈接器—輸入——添加 LASlib.lib。
  10. 使用LASTools(LASlib)庫讀寫laswen文件的例子,可以下載資源:https://download.csdn.net/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?瞭解的同學歡迎在下方留言,謝謝。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章