# CLONE 下來 首先,就是到[官網](https://github.com/mmp/pbrt-v4)把 Source File 給 clone 下來。 # 前置準備 建置前,先下載好所需的 `CMAKE` 跟 `GCC`。`GCC` 的部分選擇你喜歡的就行,像我是選擇 `MinGW`。 # 使用 CMAKE 建置 接著就是使用 CMAKE 將剛剛 Clone 下來的 Source File 建置起來。 首先建立一個資料夾用來放待會建置的內容物,通常會取名帶有 Build。 1. 選擇 Source File 的位置 2. 選擇建置好的檔案要放置的位置 3. 按下 Configure 4. 按下 Generate 此時要注意,CMAKE 有可能會警告你說,缺少哪些東西;有些東西其實有附在 Source 裡面,像是 `Zlib`;有些不會,像是 `OpenGL`。 # MAKE 在剛剛 Build 的資料夾內下 make 指令,但是因為我是用 Windows,所以 MinGW 提供的是 `mingw32-make.exe` 這點要注意。 然後下 `make -j8` 後,就可以等他跑完了。 > `-j8` 是啟用多執行緒,可以跑更快 # 問題 想當然的, Make 過程不會像網路各種教學演示的安然無恙。 ## 問題1:GCC 版本問題 GCC 在第 13 版的時候,不會再廣泛的 include `cstdint` 到各種 header 裡面,因此會在 Build OpenEXR 的時候說某個地方沒有 include 到 `cstdint`,找不到所需的各種 `__int`。 [解答在這](https://github.com/mitsuba-renderer/mitsuba3/issues/838)。 好死不死我用的是 13.2.0,所以就出錯了 :_)。 ## 問題2:PTEX 版本問題 因為 V4 使用的是舊版的 PTEX,這是皮克斯公司開發的一個第三方圖書館,但是當中的 `PtexInt.h` 裡面有個部分忘記判斷 MinGW,所以多定義了自己的各種 `int_`,導致跟後來 pbrt 的定義衝突。 [解答在這](https://github.com/mmp/pbrt-v4/issues/297)。 但是新版的 PTEX 沒有這個問題,不過作者下面說他很忙可能會要很久才把 PTEX 換成新版的。 解決方法也很簡單,就是把 clone 下來的檔案,找到 `PtexInt.h` 進行修改就好: ```c= #if defined(_WIN32) || defined(_WINDOWS) || defined(_MSC_VER) #if defined(_MSC_VER) && _MSC_VER >= 1600 // the line above should be fixed as : // #if defined(_MSC_VER) && _MSC_VER >= 1600 || defined(__MINGW64__) #include <stdint.h> #else typedef __int8 int8_t; typedef __int16 int16_t; typedef __int32 int32_t; typedef __int64 int64_t; typedef unsigned __int8 uint8_t; typedef unsigned __int16 uint16_t; typedef unsigned __int32 uint32_t; typedef unsigned __int64 uint64_t; #endif #else #include <stdint.h> #endif ``` 修改好後再重新 build 就行了。 # 小結 如果是用 Mac 或 Linux 系統的朋友,有相當高的機率不會遇到這個問題。首先應該不會有人太頻繁的更新 GCC,所以版本大多在 13 以下;再來 Mac 預設的編譯器是由 Clang 提供,而 Linux 我不確定但我覺得八成也是 Clang。 以上,Debug 的過程真歡樂 :_)。