官方在 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"
沒有留言:
張貼留言