pretty code

2022年8月21日 星期日

Install PCL on Windows 10

PCL 是一個點雲運用的函式庫。

官方在 Download 頁面中建議使用 vcpkg 來安裝,在過程中有遇到一些問題,記錄一下以免忘記。

建議用 Linux 應該會比較省事或者是使用 PCL 官方預先編譯好的版本(github),但就必須安裝一樣版本的開發環境,目前 1.12.1 版配合的是 VC2019。

01. 安裝 Visual Studio Build Tools 2017

此刻 PCL 的版本是 1.12.1,我電腦的環境是 VC2015,因為 PCL 是用 C++ 開發,有用到比較新的 C++ 標準語法,至少要 VC2017,本想直接上到 VC2022,但安裝過程會警告跟 Windows 10 不合,就沒有安裝 VC2022 了。

這裡是為了避免 Community 版商業使用的問題,因為 Build Tools 的授權跟 Community 不同,個人用的話應該直接安裝 Community 就可以。

我只打勾基本【Visual C++ build tools】和【通用Windows 平台建置工具】。

02. 安裝 vcpkg

建議路徑為 C:\src\vcpkg,故在 C:\src 下執行下面指令。

git clone https://github.com/microsoft/vcpkg
.\vcpkg\bootstrap-vcpkg.bat

03. 安裝 PCL

打開【適用於 VS 2017 的 x64 Native Tools 命令提示字元】,切到 C:\src\vcpkg 路徑。

vcpkg install pcl:x64-windows

執行上面指令會順便安裝其他相關模組,其中編譯 PCL 過程最久,我的電腦花了 2 hours,全部是 2.722 hours。

04. 執行 vcpkg integrate install 

這個步驟不確定是否要執行,但因為我後面有遇到其他問題,我有回過頭來做這個步驟,故不確定是否是必須?但我在第二台電腦整個重做還是有做這個動作。

---------------------------

測試 PCL

01. 使用官方 pcd_write.cpp 範例

02. 使用官方 CMakeLists.txt 範例

但必須加上 set(PCL_DIR "C:/src/vcpkg/installed/x64-windows/share/pcl"),否則 cmake 過程中會失敗。

03. 執行 cmake

cmake . -A x64

上面那個 -A 是關鍵,否則下面步驟一直會失敗。

04. build pcd_write.cpp

cmake 後會產生 VC 的專案檔,但因為我們只有 Build Tools,故使用 msbuild 產生執行檔。

msbuild pcd_write.sln

沒有意外的話,在 Debug 目錄下就會有執行檔,並且還會把相關 dll 複製到該目錄。

2022/08/22 更新

試了幾個範例都沒有什麼問題,直到試了一個 visualization 的範例,會說找不到相關的標頭檔,看起來是用到 VTK,使用 vcpkg list 查詢,確實是沒有 VTK,網路上找了一下,要用 vcpkg install pcl[visualization]:x64-windows 的方式才會有 VTK,可惜我在編譯 VTK 時,會發生內部編譯器錯誤,網路上查了一下似乎跟 VTK 還有 PCL 版本有關?也許是要換 VC2019?但懶得重新編譯了,直接安裝 VC2019 + 官方編譯的版本。

步驟如下

01. 安裝 VC2019

步驟同 VC2017。

02. 安裝官方版本

預設會安裝在 C:\Program Files\PCL 1.12.1,另外 OpenNI2 似乎也被一併安裝了,路徑為 C:\Program Files\OpenNI2。

安裝以後,環境變數會多一個 PCL_ROOT 以及其他 OpenNI2 的相關變數,故我們就不用去改 CMakeLists.txt 了。

隨便拿一個範例來試,看起來這樣就可以了,cmake 已經內建在 VC2019。

有些範例需要 OpenNI2.dll,去 C:\Program Files\OpenNI2\Tools 複製一份到執行檔路徑即可,或是把這個路徑加到 PATH,程式執行時會在 PATH 環境變數下尋找。

2022/08/25 更新

又看了一些討論,覺得 vtk 應該要沒問題才對,懷疑跟我測試的電腦 VC 版本太多有關?重新以 vcpkg install pcl[core,qt,vtk]:x64-windows 重 build,果然一切順利完成。

這次再執行 vcpkg integrate install 後,出現提示可以加上下面參數在使用 cmake 時。
 
-DCMAKE_TOOLCHAIN_FILE=C:/src/vcpkg/scripts/buildsystems/vcpkg.cmake

之後改用 cmake . -A x64 -DCMAKE_TOOLCHAIN_FILE=C:/src/vcpkg/scripts/buildsystems/vcpkg.cmake,就不用再自己定義相關 PCL_DIR 等等。

這次連 Qt 的範例都可以順利完成,唯一可惜的是 Qhull 不知為何沒有成功?

之後有空再繼續嘗試。

2022/08/29 更新

終於解決了 Qhull 這個錯誤 (AllInOne)
surface features related to qhull will be disabled

只要設定下面 Windows 環境變數
set QHULL_DIR=C:\Program Files\PCL 1.12.1\3rdParty\Qhull\lib\cmake\Qhull

convex_hull_2d 的官方範例便可以順利編譯了(為了順利執行,還得把 C:\Program Files\PCL 1.12.1\3rdParty\Qhull\bin 加到 Windows 環境變數 PATH

但 vcpkg 使用同樣的一招還是無法成功。

2022/09/09 更新

找到 vcpkg Qhull issue 的解決方式了,假設 cmake 後的 VC 專案檔為 AAA.vcxproj,找到所有前置處理器定義的 DISABLE_QHULL,把它全移除掉即可,這樣編譯 Qhull 相關就可以成功了。

另外,-DCMAKE_TOOLCHAIN_FILE 這招有時會失敗,可以在 CMakeList.txt 裡面加上 find_package(PCL CONFIG REQUIRED),不要使用官方或網路範例指定版本的寫法。

2022/09/27 更新

又找到另一個 vcpkg Qhull issue 的解決方式。

cmake 時加上 cmake . -A x64 -DCMAKE_TOOLCHAIN_FILE=C:/src/vcpkg/scripts/buildsystems/vcpkg.cmake -DCMAKE_CXX_FLAGS_INIT="-UDISABLE_QHULL"

則在編譯時,會先 /D DISABLE_QHULL  再 /U DISABLE_QHULL,故最後就不會有這個 define,這個方式比前一個解決方式簡單。另外,有試過 cmake 的 remove_definitions(/DDISABLE_QHULL) 無法成功,但用 add_definitions(/UDISABLE_QHULL) 是可以的。

結論

Fix Qhull issue

AllInOne
set QHULL_DIR=C:\Program Files\PCL 1.12.1\3rdParty\Qhull\lib\cmake\Qhull

vcpkg 
add_definitions(/UDISABLE_QHULL)  or  -DCMAKE_CXX_FLAGS_INIT="-UDISABLE_QHULL"