這個文件幾乎上包含了所有安裝電腦圖學所需環境的教學以及問題解決方案,但裡面還是有幾點以下想聲明:
對於可能沒用過終端機或是不熟的同學,複製命令指令時請不要把
$
也複製上去,這只是一個標註它是命令列指令而非程式碼而已,不然要是複製上去的話,所有的指令都會是無效的哦!
vcpkg.exe
為病毒(Avast 有時候會誤判,發生誤判請加到白名單即可)。首先在 C:\
路徑下新增一個資料夾,名稱可以叫 dev
或者 src
,可以自己依造喜好來決定,但往後的 vcpkg 路徑就要記住,這邊教學將會使用 dev
為資料夾名稱。
創建好了,請開啟終端機(命令提示字元或 Powershell),並輸入指令:
# 切換目錄到 C:\dev
$ cd C:\dev
# 把 vcpkg 在 github 上的 repo 複製下來,所以 C:\dev 中將會多一個叫 vcpkg 的資料夾
$ git clone https://github.com/microsoft/vcpkg
vcpkg.exe
,指令為:$ .\vcpkg\bootstrap-vcpkg.bat
C:\dev\vcpkg
中就會有一個 vcpkg.exe
,並且透過在終端機輸入指令即可看到可使用的指令列表:# 沒有加入環境變數 PATH 之前,需要特別使用 絕對路徑 或者是 相對路徑,才能呼叫到 vcpkg
$ .\vcpkg\vcpkg
# 有加入環境變數,使用上就會很方便,也不需要指令路徑在任何的工作目錄下都可以執行
$ vcpkg
如果你嘗試輸入
vcpkg
卻跳出說找不到該指令,那就是環境變數沒設定好,環境變數的設定請看這
安裝好 vcpkg 之後,就可以使用基本指令安裝所需要的套件,詳細使用方法請詳閱 vcpkg 使用方法。
到 CMake 官網下載安裝檔案(.msi)並安裝即可,最新穩定辦本為 3.22,記得安裝的時候要勾選【Add CMake to the system PATH for all users】,這樣一來就會自動把 cmake 加入環境變數了。
安裝好後,在終端機輸入 cmake
就會顯示相關資訊,就代表安裝成功了:
這個安裝其實是非必要的,前提是如果你習慣使用 VS Code 做為 IDE 的話,我才會建議安裝 Ninja,它是一個輕量級的建置系統,安裝方法很簡單,直接到官方 Github 頁面下載壓縮檔(ninja-win.zip
),並解壓縮它,將裡面已經建置好的執行檔 ninja.exe
,移置到路徑 C:\dev\Ninja\
當中(自己要創建資料夾),並且一樣將 ninja 設定到環境變數 PATH 中,如此一來開啟終端機之後就可以輸入指令:
有看到以上資訊就代表安裝成功;環境變數設定請看這。
一般來說,絕大數人如果使用的是 Windows 系統,而且有安裝 Visual Studio 的話,就算 IDE 不是用它,但編譯器都是預設抓取 MSVC,這個是微軟開發的 C 或 C++ 編譯器,如果你有個人喜好就是想用 GCC 的話,這邊有提供一個方法可以教大家使用。
通常 GCC 編譯器本身是 Linux 或是 Unix 系統上才會出現的編譯器,而移植到 Windows 上的版本其實有很多種,例如:MinGW
、MSYS2
、Cygwin
等等,但這邊我推薦使用 MinGW
,但是 MinGW
其實是有分 MinGW32
和 MinGW64
,顧名思義就是位元的不同,所以這邊我一律推薦請下載 TDM-64-GCC
,裡面就包好了 32 位元和 64 位元的 MinGW
,相關的設定也都處理好所以非常方便,載點在這邊。
記得要下載【tdm64-gcc-10.3.0-2.exe】,要有 64 和 32 位元的 GCC;且通常如果電腦還有其他的 GCC ,除非你真的很確保你不會發生衝突,不然我建議都是一律先移除乾淨再來安裝新的 GCC。
下載點開安裝檔後,左邊會列出你電腦上有安裝過的版本(如果是第一次安裝右邊的清單會是空的),路徑各位可以自行決定,但助教我推薦 C:\dev\TDM-GCC-64
路徑,也方便進行管理,這邊只需要按下【Create】即可。
請選擇含有 MinGW64 的版本:
選擇你要安裝的路徑。
使用預設的安裝設定即可,下一步直接點擊【Install】即可:
安裝完成之後,理論上只要安裝成功,你就可以從終端機上輸入以下指令:
如此一來這樣就代表有安裝成功,在 PowerShell 上你還可以輸入以下指令來查看該指令對應到的程式路徑:
x64-mingw-dynamic
版本的,安裝不同 triplet 版本的教學請看這。CMakeLists.txt
當中,必須修改引入 OpenGL
函式庫的程式碼為如下:
find_package(OpenGL REQUIRED)
target_link_libraries([你的target名稱] PRIVATE OpenGL::GL)
一定要有引入
OpenGL::GL
才行,助教之前給的範例程式有的寫錯,譬如可能是寫OpenGL32
、或是完全沒有引入OpenGL::GL
相關的指令;如果是有使用到 glu 函式庫的話,就必須還要額外引入OpenGL::GLU
,但這個通常是你有用到舊版(Legacy)OpenGL 才會需要
雖然如果使用 MSVC 編譯似乎是可忽略這些引入設定,但現在為了統一且跨平台以及環境的一致性,就算你是使用 MSVC 編譯的我也強烈建議你也加上這些 OpenGL 的引入設定。
settings.json
中修改設定檔為如下:
{
"cmake.buildDirectory": "${workspaceFolder}/build/${buildType}",
"cmake.generator": "Ninja",
"cmake.configureSettings": {
"CMAKE_MAKE_PROGRAM": "C:/dev/Ninja/ninja.exe",
"CMAKE_TOOLCHAIN_FILE": "C:/dev/vcpkg/scripts/buildsystems/vcpkg.cmake",
"VCPKG_TARGET_TRIPLET": "x64-mingw-dynamic"
}
}
注意就算你 vcpkg 安裝了
x64-mingw-dynamic
的套件,但你的程式碼可能編譯的時候依舊還是抓取x64-windows
的 triplet,所以這邊要多一個VCPKG_TARGET_TRIPLET
參數的設定。
這個問題只會發生在 Windows 作業系統上,如果你是使用助教所提供的 GLFW 或是 SDL2 的程式範例檔案,因為這個檔案會使用到外部檔案例於著色器(Shader)以及貼圖(Texture)等等,所以我們有在其專案中的 CMakeLists.txt
上設定以下腳本:
add_custom_command(TARGET triangle-example POST_BUILD
COMMAND ${CMAKE_COMMAND} -E create_symlink
"${CMAKE_SOURCE_DIR}/shaders"
"$<TARGET_FILE_DIR:triangle-example>/shaders"
DEPENDS
"${CMAKE_SOURCE_DIR}/shaders" # Make sure the directory exists
COMMENT "Creating symlink from build tree to project resources..."
VERBATIM
)
基本上該 CMake 指令只是創建一個 Symbolic Link 的資料夾在你程式編譯二進位執行檔案的目錄下(
$<TARGET_FILE_DIR:tgt>
,這個是 CMake 的 Generator 表達式,詳情可參考此文件),可以理解成捷徑的一種,但跟 Windows 專有的.lnk
捷徑檔是截然不同的東西,這個比較常使用在 Linux 或是 Unix 系統上,被稱為【軟連結】。
至於為甚麼需要在二進位根目錄下創建 Symbolic Link 的原因,主要是因為我剛剛所說的外部檔案,一般來說都是會放置在專案根目錄下(可能跟程式碼同個目錄層),但程式編譯成可執行檔之後的路徑會有所變動,而一般來說我們的引入路徑都是寫所謂的【相對路徑】,為了避免這些文件讀取不到的情況,才會使用【軟連結】這個方式。
而這個指令一般而言會導致編譯程式會發生以下錯誤:
其解決方案很簡單,就是到【設定】->【更新與安全性】->【開發人員專用】,然後將【開發人員模式】給它開啟起來就解決了:
這邊教學只教 Windows 10,其他版本作業系統的設定方式基本上大同小異,但可能某些地方會不太一樣,記得多加注意就好。
請先對【本機】按下右鍵,並點選【內容】。
將會跳出 Windows 新版本的【設定】,拉到最下面點選【進階系統設定】。
點選【環境變數】。
請在【系統變數】區塊,找尋 PATH
並點選後,選擇【編輯】。
請點選右上的【新增】,接著就可以輸入想要設定環境變數的路徑:
vcpkg.exe
的話,路徑通常是:C:\dev\vcpkg
ninja.exe
的話,路徑通常是:C:\dev\Ninja
按下確定之後就可以關掉,之後終端機一定要重新啟動這個環境變數的設定才會奏效,如此一來就可以設定成功了。
本教學使用 MacBook Air 2015,且作業系統版本為 macOS Big Sur (11.4) 做為測試環境。
我自己不太確定是不是兩個步驟都必須要做,至少我自己是先下載了 XCode,安裝好後才開啟終端機(bash 或 zsh)並輸入以下指令:
$ xcode-select --install
這大概是確保你的蘋果電腦相關的開發環境,我記得安裝之後就會有 Clang 編譯器。
$ brew
如果發生找不到該指令的問題話,就輸入以下指令來安裝 Homebrew 吧:
$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
安裝好 Homebrew 之後就用它來安裝 gcc 吧!
$ brew install gcc
之後就可以來安裝 vcpkg,基本上安裝的方法一樣也是透過 Git 的方式來安裝,而安裝路徑就沒有一定的限制,vcpkg 的 github 頁面還寫說:【it can be installed anywhere.】,所以這邊就是隨著使用者安裝開心吧,但這邊助教建議可以安裝在 ~\repo
下,路徑名稱不要太長,不然打參數的時候會很辛苦:
# 下載 vcpkg 並進行建置(請記得事先 cd 到正確的工作目錄下)
$ git clone https://github.com/Microsoft/vcpkg.git
$ ./vcpkg/bootstrap-vcpkg.sh
基本上安裝好後,你就可以輸入以下語法來執行 vcpkg:
# 記得切換到你 vcpkg 上一層的工作目錄下
$ ./vcpkg/vcpkg
# 如果在同一個目錄層下就是
$ ./vcpkg
# 當然我相信 apple 應該也可以設定環境變數,我是不會設定,這部分可能就要自行研究了
$ vcpkg
至於如何使用 vcpkg 請參考 vcpkg 使用方法。
如果你是想了解我需要安裝甚麼套件的話,請詳閱這邊。
如果你有需要安裝的話,就透過 Homebrew 安裝吧!
$ brew install cmake
如果你有需要安裝的話,就透過 Homebrew 安裝吧!
$ brew install ninja
通常會使用 Linux 作業系統的人,我想對於這些設定都相當熟悉,我就不多加解釋了:
# 下載 vcpkg 並進行建置(請記得事先 cd 到正確的工作目錄下)
$ git clone https://github.com/Microsoft/vcpkg.git
$ ./vcpkg/bootstrap-vcpkg.sh
基本上安裝好後,你就可以輸入以下語法來執行 vcpkg:
$ ./vcpkg/vcpkg
至於如何使用 vcpkg 請參考 vcpkg 使用方法。
如果你是想了解我需要安裝甚麼套件的話,請詳閱這邊。
基本上 IDE 設定都是跨平台的,所以設定上都是大同小異,雖然上面諸多設定都是擷取至 Windows 上的螢幕截圖,但設定流程與步驟都是差不多的。
如果使用 Visual Studio 做為 IDE 的話,只需要輸入以下行指令就可以自動幫你處理好 vcpkg 相關的環境設定,指令為:
# 同時這個指令也會顯示出你的 CMAKE_TOOLCHAIN_FILE 完整路徑
$ vcpkg integrate install
如果你都是按照本教學的方式的話,理論上你會是安裝 64 位元的套件,所以你的程式編譯的時候只能使用 x64 的選項,如下圖:
如果你想要編譯 32 位元的程式,那 vcpkg 的套件就必須要安裝 x86-windows 版本,詳情請看如何使用 vcpkg 的 triplet 的部分。
使用 Visual Studio 開發,繳交作業或是使用 git 版控時請務必將 .vs 隱藏資料夾刪除(刪除後不會影響你的程式,所以不用害怕),這個檔案單純只是 Visual Studio 的一些設定檔,是不必須而且檔案很肥。
在 Visual Studio 有個刪除 CMake 快取的方法,那就是從 IDE 裡面的方案總管中,對著 CMakeLists.txt
按下右鍵,找尋【CMake 快取】選項後,點選【刪除快取】即可。
當你發現你點開 CMakeLists.txt
之後,上面跳出黃黃的一小條資訊,這代表目前你專案根目錄的 CMake 快取可能還沒有產生,或者是你剛剛更動了 CMakeLists.txt
文件中的設定導致快取還沒有更新,這個時候不要猶豫按下【產生】就對了。
由於 Visual Studio Code 本身是一款輕量級的 IDE,所以如果你想要用 VS Code 的話,你首先會需要安裝 CMake Tools
套件:
有點忘記安裝此套件是否有強制需求一定要先安裝 CMake 了,理論上就先安裝看看,如果真的有發生甚麼錯誤的話,再自行到 CMake 官網下載並安裝之後再來安裝 VS Code 的套件吧,至於 CMake 的安裝教學請看這。
再來安裝另一個套件叫 C/C++
基本上就是增加對於 C 或是 C++ 的語法偵測等等擴充功能:
這些套件都安裝好後,只要你使用 VS Code 開啟 CMake 專案(一定要有 CMakeLists.txt
檔案才行),都會跳出相關的 CMake 設定,譬如說下方這一列:
Visual Studio Community 2019 Release - amd64
也就是採用 MSVC 做為預設的編譯器,如果你想改用 GCC 的話也是改動這一個設定,但詳情請看這。[all]
,也就是全部都建置。但是即便如此,目前可能還是會發生無法編譯的情況,原因是因為我們並沒有告訴 CMake 我們的 vcpkg 路徑在哪裡,這樣它會抓不到我們的套件,如此一來就不能編譯,所以我們需要自行在專案根目錄下創建一個名稱為 .vscode
的資料夾,並在裡面新增 settings.json
檔案,內容如下:
{
"cmake.buildDirectory": "${workspaceFolder}/build/${buildType}",
"cmake.generator": "Ninja",
"cmake.configureSettings": {
"CMAKE_MAKE_PROGRAM": "C:/dev/Ninja/ninja.exe",
"CMAKE_TOOLCHAIN_FILE": "C:/dev/vcpkg/scripts/buildsystems/vcpkg.cmake"
}
}
這邊的設定是說,cmake.buildDirectory
可以自訂義你建置 CMake 專案的生成位置,會這樣設定的好處就是說至少會去區分 debug
和 release
資料夾(根據你的 ${buildType}
決定);第二個是告訴 CMake 我們預設的專案建置器要使用 Ninja,如果沒設定的話預設會是使用 Visual Studio 來產生專案檔,個人是推薦使用 Ninja,其安裝方式可以參考這裡。
再來就是定義路徑,我們必須告訴 CMake 兩件事情,分別是 ninja 以及 vcpkg 的路徑(如果 ninja 有設定環境變數的話就不需要特別寫了),如果都是按造此教學方式的話路徑基本上就是如同上方所示了。
通常只要有重新設定 CMake 的相關設定,為了確保能正確運作,我一律都先建議先清除掉 CMake 快取,可以在 VS Code 按下
Ctrl
+P
,並輸入>CMake:
,就會跳出相關的選項,選擇【CMake: 刪除快取並重新設定】選項,就可以把 CMake 快取刪除並將會重新產生
但如果還是有發生無法編譯的問題的話,就再執行看看【CMake: 重設 CMake 工具延伸模組狀態(進行疑難排解)】選項,基本上它會整個重新啟動 VS Code,有些問題通常這樣可以獲得解決。
CLion 是一個相當好用的 IDE,這個一般來說不是免費的,但如果你是海大學生通常都可以透過學校註冊來免費使用一波,所以相當佛心。
使用上也很簡單,使用 CLion 開啟 CMake 專案後,請按下左上角的齒輪圖示,並按下【Settings】:
接著選擇【Build, Execution, Deployment】,並且點選【CMake】:
之後跳出以下畫面,你只需要在 CMake options
加上指定你自己安裝的 vcpkg 套件路徑,例如:-DCMAKE_TOOLCHAIN_FILE=C:/dev/vcpkg/scripts/buildsystems/vcpkg.cmake
,這樣就設定完成了。
你也可以設定多一個 release 的設定檔,而且你也可以自己定義
Build Directory
。
至於如何在 CLion 底下重新產生 CMake 快取,可以透過【Tools】->【CMake】->【Reset Cache and Reload Project】來達成:
一樣到 CLion 的設定,左邊選擇【Build, Execution, Deployment】,並且點選【Toolchains】,右邊可以發現 CLion 基本上會自動抓取你電腦預設的編譯器(通常是 MSVC),通常這邊的 Architecture 預設應該是:amd64
,如果不是的話記得改過來!
這邊是寫給如果你是很喜歡使用終端機來操作的話,其實你是可以完全使用 CMake 指令來產生快取、建置專案、甚至編譯程式,其步驟如下:
cmake -S <專案根目錄> -B build/Debug \
-D CMAKE_BUILD_TYPE=<Debug|Release> \
-D CMAKE_TOOLCHAIN_FILE=[你的 vcpkg 安裝路徑]/scripts/buildsystems/vcpkg.cmake \
-G Ninja
-S
:代表定義你的專案根目錄路徑,一般來說就是 CMakeLists.txt
的所處根目錄,你可以直接寫 .
以相對路徑來代表當前工作目錄,或是使用絕對路徑。-B
:代表定義你的建置目錄位置,一般來說會是 build/Debug
或 out/Debug
。-D
:定義 CMake 的變數,例如你可以控制 CMAKE_BUILD_TYPE
來決定你要產生 Debug 模式編譯還是 Release 模式;或者透過 CMAKE_TOOLCHAIN_FILE
告訴你的 CMake 你的 vcpkg 路徑在哪裡。-G
:定義你的專案建置器,你可以使用 Unix 的 Makefile、或是 Ninja、抑或是 Visual Studio 的解決方法(.sln),這邊範例使用 Ninja。cmake --build build/Debug
$ vcpkg search [套件名稱]
$ vcpkg install <套件名稱>
# 沒有列出所有的套件,想要最詳細的話可以輸入以下指令查詢。
$ vcpkg search imgui
> imgui
> imgui[glut-binding]
> imgui[glfw-binding]
> imgui[sdl2-binding]
> imgui[opengl2-binding]
> imgui[opengl3-binding]
這個時候安裝的時候,如果先前已經有安裝到其他的 imgui 實做版本,後面就會要求再加上 --recurse
參數,意思是安裝好該套件後會自動重新建置 cmake。
$ vcpkg install <套件名稱> --recurse
什麼時候需要加上此參數呢?當你遇到如圖以下的訊息時,就需要加上該參數。
# 你可以指定安裝特定的 triplet(例如 64 位元),一般而言會自動去偵測作業系統而定。
$ vcpkg install <套件名稱> --triplet=x64-windows
!!!注意!!!:triplet 本身會依造你的作業系統去決定其預設值,通常來說會如以下表格:
作業系統 | 預設編譯器 | Triplet |
---|---|---|
Windows | MSVC | x86-windows |
Linux | gcc | x64-linux |
macOS | clang or gcc | x64-osx |
而 Windows 上預設是安裝 x86-windows
(32位元),建議一律安裝 x64-windows
(64 位元)的套件,如果你都只安裝 32 位元的話,那進行編譯的時候也就只能編譯出 32 位元的程式。
如果你是在 Windows 上想使用 Mingw 的 gcc 編譯的話,Triplet 請改成
x64-mingw-dynamic
,其原因是因為不同編譯器所編譯出來的套件原則上是不能共用的,所以就算你是 Windows 作業系統,但一旦你的編譯器是使用 gcc 的話就會需要安裝這個 triplet,而且要注意你的 gcc 必須要能夠支援編譯 64 位元的程式,建議可以安裝 TDM-64-GCC,詳情請看這
如果你想了解更多的 triplet
設定請輸入以下指令:
$ vcpkg help triplet
$ vcpkg remove <套件名稱>
# 或者刪除已經過時的套件
$ vcpkg remove <套件名稱> --outdated
$ vcpkg list
# 顯示所有需要更新的套件
$ vcpkg update
# 列出需要重新建置已經過時的套件(因為安全機制的關係)
$ vcpkg upgrade
# 如果真的要重新建置的話,需要加上參數
$ vcpkg upgrade --no-dry-run
如果你的 vcpkg 版本過舊,那就算有套件更新,vcpkg 也不會知道也就無法更新至最新版本,所以必須要先更新 vcpkg,再來更新套件,而更新 vcpkg 的方式就是使用 git:
# 記得要先切換根目錄到 C:\dev\vcpkg 底下
$ git pull
# 有時候 git 更新了之後需要再次重新建置 vcpkg.exe (執行批次檔,Window Only)
$ .\bootstrap-vcpkg.bat
# 或者(執行 shell 腳本,專門給 Linux 或 macOS使用)
$ ./vcpkg/bootstrap-vcpkg.sh
$ vcpkg install freeglut glm imgui[opengl2-binding,glut-binding] --triplet=[請選擇你需要的 triplet] --recurse
不知道你的 Triplet 該如何選擇的請仔細看這裡。
macOS 本身似乎有些狀況,如果發現無法正常安裝 freeglut 套件的話,可能會需要先使用 homebrew 安裝幾個 freeglut 會需要用的套件,指令如下:
$ brew install mesa-glu libx11 xinput
安裝完成後,理論上就能正常透過 vcpkg 來安裝 freeglut 了,但記得蘋果跟別人不一樣,在 .c
或 .cpp
程式裡面要引用 glut 的標頭檔不能使用 #include <GL/glut.h>
或 #include <GL/freeglut.h>
,必須要使用 #include <GLUT/glut.h>
才行,或者改成下方程式碼:
#ifdef __APPLE__
#include <GLUT/glut.h>
#else
#include <GL/freeglut.h>
#endif
經過我的實測,似乎透過 vcpkg 在安裝 glfw3 套件時,會要求你透過 Homebrew 安裝 pkg-config 這個套件,基本上就安裝該套件就可以解決了:
$ brew install pkg-config
確認安裝成功之後再來輸入:
$ vcpkg install glfw3 glad glm imgui[opengl3-binding,glfw-binding] --triplet=[請選擇你需要的 triplet] --recurse
不知道你的 Triplet 該如何選擇的請仔細看這裡。
另外你的 GLFW 創建 OpenGL Context 時,程式必須多加上一行:
#ifdef __APPLE__
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
#endif
$ vcpkg install sdl2 sdl2-image[libjpeg-turbo] glad glm imgui[opengl3-binding,sdl2-binding] --triplet=[請選擇你需要的 triplet] --recurse
# 可選套件(支援音效、網路以及字體的相關函式庫)
$ vcpkg install sdl2-mixer sdl2-net sdl2-ttf --triplet=[請選擇你需要的 triplet]
不知道你的 Triplet 該如何選擇的請仔細看這裡。
另外你的 SDL2 創建 OpenGL Context時,程式必須多加上一行:
#ifdef __APPLE__
SDL_GL_SetAttribute(SDL_GL_CONTEXT_FLAGS, SDL_GL_CONTEXT_FORWARD_COMPATIBLE_FLAG);
#endif
你可能會需要透過套件管理器安裝一些套件:
$ sudo apt-get install libsdl2-dev libglm-dev
$ sudo dnf install SDL2-devel glm-devel
國立臺灣海洋大學 資訊工程學系 電腦圖學實驗室 Lab 503
課程名稱:電腦圖學
授課教授:翁世光 教授
課程助教:張竣傑
OpenGL