pretty code

顯示具有 vcpkg 標籤的文章。 顯示所有文章
顯示具有 vcpkg 標籤的文章。 顯示所有文章

2023年9月13日 星期三

遺珠之憾的雞肋

這個標題下的有點誇張,但我的感覺還真是如此XD


上面是一個使用 binary code 的結構光專案,有趣的是作者使用 blender 軟體來建構所有物件資訊,並非由真實的照相機及投影機所產生。

純以 decode 來說,gray code 相臨數字只差一個 bit 的編碼特性會比 binary code 在找對應點時好很多,故實務上應該是比較少使用它來編碼,目前以我在大衛朗基羅的經驗來看,gray code + phase shift method 應該是有比較好的成像品質。

之前在開始學習結構光相關主題時,我就把 github 上的 700 多個專案看過一遍,坦白說這是個苦差事,在只知道結構光皮毛知識下,要如何分辨哪個專案能幫助學習確實有點困難!單純看 README.md 不太能得到有用資訊,除非專案作者很用心在寫文件XD

故我的 SOP 就是檢查 code 是否齊全,有沒有相機圖片,是否有給相機內參或 R、t,當然最重要的一點就是 code 是否能跑?

如果單純是 Python 還好辦,相關 modules 裝一裝就好;Matlab 沒有軟體就算了,只要有 code 可以 porting 就好;但遇到 C++ 類的就沒輒,我一定要先能成功編譯它才能夠去跑它! 

這個專案很不巧的就屬於這種,即使我有 vcpkg 的加持,還是要經歷邊報錯邊檢查少了什麼再繼續安裝的無限循環,這個專案為了平行處理還使用了 halide 的函式庫,故還需要 llvm 的相關工具,印象中當初為了這個專案,假日時常要遠端登入公司電腦好確保 vcpkg 安裝相關函式庫時有順利執行,沒有半途發生錯誤被中斷,因為 llvm 很吃硬碟空間,為了這個還要搬移資料分割區資料,並執行微軟硬碟工具內建動態擴充功能擴充 C 槽才能順利安裝。

我還記得當初因為硬碟空間不足,vcpkg 安裝常出現莫名錯誤,當時沒意會到是這個原因,故我在某一次的放假遠端登入中終於放棄,改使用家裡電腦安裝。雖然最後有成功安裝,但因為兩邊電腦發生過的安裝錯誤實在太多,故我也來不及寫筆記XD

好不容易順利執行,即使都是使用 blender 的假資料,binary code 的 dense match 還是很吃二值化設定,故成像品質也只是 so so,所以最後這個專案也沒有放進我安排的學習清單中,所以我才說它是一個遺珠之憾的雞肋XD

剛在電腦看到殘缺的筆記資料,還是把它記錄一下好了,凡走過必留下痕跡。

build llvm error
'atlbase.h': No such file or directory

印象中,這個 error 是 VS building tool 少裝 ATL 相關的套件,再 Google 一下應該就有答案?

-----------------------
vcpkg install halide:x64-windows
vcpkg install glm:x64-windows
vcpkg install glfw3:x64-windows
vcpkg install llvm[target-all,clang-tools-extra]:x64-windows

-----------------------
cmake . -A x64 -DCMAKE_TOOLCHAIN_FILE=C:/src/vcpkg/scripts/buildsystems/vcpkg.cmake
msbuild xxx.sln /p:Configuration=Release

2023/09/14 更新

花了好幾個假日編譯好的東西還是想要留個記錄,於是在辦公室的電腦又做了一次XD

果然,憑著殘缺的筆記是不夠的,這次在 build halide 又遇到奇怪的問題,改先安裝 llvm,It is building …

2023/09/14 更新

llvm 遇到錯誤了,沉思中…

2023/09/27 更新

擴充記憶體到 16G 後,看起來記憶體不足的問題有解決,但在寫入檔案時會失敗。

mt.exe : general error c101008d: Failed to write the updated manifest of xxxxx.

試著將 C:\src\vcpkg 加到 Windows Defender 的例外掃瞄資料夾,但這個問題還是沒解決,可能真的必須關掉防毒軟體才行,我們可能沒有權限做此件事?

2023年7月20日 星期四

vcpkg + cmake + x64-windows-static

vcpkg + cmake 的方式在 build VC 專案時,預設是動態連結,而 vcpkg 的機制也很貼心的會將相關 DLL 複製一份到你的輸出資料夾中。

但如果我們想要靜態編譯又該如何做呢?

以下是使用 PCL example 裡面的 qt_visualizer 為例說明:

注意:不是每個函式庫都能靜態編譯,像 qt5-webengine 就不支援

01. 先安裝 x64-windows-static 相關函式庫,C 槽至少要有 300 GB 空間比較保險。

vcpkg install pcl[core, qt, vtk]:x64-windows-static

中間有遇到某些函式庫會安裝失敗,但去 buildtrees 下的 log 又看不出所以然,我的解決方式是單獨編譯就會成功,但如果是有相關性的不能這樣單獨編譯,否則可能會失敗,但這可能又跟電腦環境有關,故只能 by case 解決。

02. 在 CMakeLists.txt 加上相關指令。

project(pcl_visualizer)
string(REPLACE "/MD" "/MT" CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS})
string(REPLACE "/MD" "/MT" CMAKE_CXX_FLAGS_DEBUG ${CMAKE_CXX_FLAGS_DEBUG})
string(REPLACE "/MD" "/MT" CMAKE_CXX_FLAGS_RELEASE ${CMAKE_CXX_FLAGS_RELEASE}) 

上面這個是讓 VS 專案使用靜態編譯,雖然 CMake 有另一個 MSVC_RUNTIME_LIBRARY 可以設定 property,但據我測試的結果無法成功。

add_executable(${PROJECT_NAME} ${project_SOURCES})
target_link_libraries(${PROJECT_NAME} ${PCL_LIBRARIES} ${QTX}::Widgets)
target_link_libraries(XYZ C:/src/vcpkg/installed/x64-windows-static/lib/pcl_io_ply.lib) 

如果有遇到 pcl visualizer parse 相關的 link 錯誤,可以加上上面指令,根據這篇文章說法,可能跟編譯 pcl 順序有關?

03. 產生 VS 專案檔。

cmake . -A x64 -DCMAKE_TOOLCHAIN_FILE=C:/src/vcpkg/scripts/buildsystems/vcpkg.cmake -DVCPKG_TARGET_TRIPLET=x64-windows-static

04. 編譯程式

msbuild pcl_visualizer.sln /p:Configuration=Release

我有試過將 A 台電腦(Windows 10 Pro)編譯出來的執行檔 pcl_visualizer.exe 拿到另一台電腦執行(Windows 10 Pro),確實是靜態編譯無誤。

但如果是用 GCP 新開一台 VM(Windows Server 2022 + Desktop Experiences),則會有找不到 opengl32sw.dll 的問題,但程式是可以執行起來無誤,只是相關 UI 元件無法渲染,故只有一個灰底的執行畫面以及 CMD 畫面。

QWindowsEGLStaticContext::create: Failed to load and resolve libEGL functions
Failed to load opengl32sw.dll (The specified module could not be found.)
Failed to load and resolve WGL/OpenGL functions 

如果我將 Windows 10 的 opengl32sw.dll 複製到 VM 中,則是會產生 init GLEW 失敗的相關訊息(GLEW could not be initialized: Missing GL version),我個人猜測跟顯卡驅動程式有關?又或許是 Windows Server 無法使用之類的?

另外拿一台新電腦重灌 Windows 10 並更新顯卡驅動程式後,這次就可以順利執行成功。

以上就是相關的注意事項,如果本身就是使用 C/C++ 的開發者,我想有關編譯的問題應該也難不倒這些高手XD 

2023年7月18日 星期二

vcpkg + CMake 快速入門指南

呆過公司的開發環境一向以 Windows 居多,遇到 C/C++ 的專案確實沒有那麼方便,雖然我們可以針對相依函式庫一個一個各別編譯,但要看的文件及耗費的心力還真不少,故在 Windows 下我強烈推薦使用 vcpkg,它可以幫忙解決很多相依性問題,底下就是一些快速入門的訣竅,記錄一下,避免忘記。

建議

C 槽空間至少要有 1 TB,我之前編譯完 llvm + halide,Windows 11 的 C 槽就用了 500 多 GB。

另一個 Windows 10 系統,編譯 pcl(vcpkg install pcl[core,qt,vtk]:x64-windows-static)就花了 200 GB 並且因為 C 槽空間不足,最後還差 10 來個函式庫還未編譯完畢(已用空間包含先前編譯過的 x64-windows 版本了)。 

vcpkg 相關

安裝函式庫的指令,xxx 表示函式庫名稱,yyy、zzz 則是表示相關的函式庫,後面分別是指定編譯版本以及是否要靜態編譯。

vcpkg install xxx[yyy, zzz]:x64-windows (x64-windows-static)

vcpkg 安裝完會有提醒事項,如果是使用 CMake 來規劃專案,就需要把 find_package 相關的提示記起來,一般來說函式庫定義名稱會等於安裝時的 xxx,只是改成大寫。


vcpkg integrate install 則是讓 vcpkg 跟 Visual Studio 做連結,使用 cmake 時只要簡單指定 -DCMAKE_TOOLCHAIN_FILE=C:/src/vcpkg/scripts/buildsystems/vcpkg.cmake 就可以找到相關函式庫的路徑。

如果函式庫有相關,最好是要一起編譯,不然先後順序不對可能就要重新編譯,以我最近遇到的 hailde 及 llvm 來說,如果沒有先編譯 halide,llvm 就有可能要重新編譯,以我最新的筆電 i7-13700H 來說,光 llvm 就要編譯 13 個小時以上。

如果之前安裝完函式庫未記住 CMake targets,可以去 C:\src\vcpkg\installed\x64-windows\share\xxx 資料夾,檢查是否有相關的 .cmake 檔案可以參考,一般來說檔名可能會是這種形式 <PackageName>Config.cmake,詳情可以參考這裡

cmake 相關

cmake 是透過 CMakeLists.txt 來建構專案,如果函式庫是用 vcpkg 安裝的方式,則我們的 CMakeLists.txt 可以很簡單來寫。

以此專案為例,原本作者應該是沒有使用 vcpkg,故 CMakeListx.txt 寫的就比較囉嗦。

在有 vcpkg 下,我們應該只需要 find_package 及 include_directories 即可(碰到的專案還不夠多,待驗證?),剛好這個專案有例外,故我們需要另外指定 VTK include 路徑。

cmake_minimum_required(VERSION 3.19)

project(3DReconstruct)

find_package(OpenCV CONFIG REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})

find_package(PCL CONFIG REQUIRED)
include_directories(${PCL_INCLUDE_DIRS})

# fix pcl include <pcl/visualization/cloud_viewer.h> issue
# this error is due to the unadaptable including format between PCL and vcpkg.
# so we must use absolute path, this solution depends on your installation version of VTK.
# see https://github.com/microsoft/vcpkg/issues/24439
include_directories(C:/src/vcpkg/installed/x64-windows/include/vtk-9.0)

# build executable
add_executable(Phase_Shift main.cpp CalPhase.h CameraCalib.h)
add_library(Camera_Calib_LIB CameraCalib.cpp CameraCalib.h)
add_library(CalPhase_LIB CalPhase.cpp CalPhase.h)
add_library(ProPoint_LIB Propointcloud.cpp Propointcloud.h)

target_link_libraries(Phase_Shift ${OpenCV_LIBS} ${PCL_LIBRARIES})
target_link_libraries(Phase_Shift Camera_Calib_LIB)
target_link_libraries(Phase_Shift CalPhase_LIB)
target_link_libraries(Phase_Shift ProPoint_LIB)