---
# System prepended metadata

title: 建置 PBRT V4 紀錄
tags: [PBRT]

---

# 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 的過程真歡樂 :_)。
