# 在OSX Catalina 上安裝 Allegro 5 ##### 特別感謝 @kerwintsai, @Stephanie Tai 提供講義的編寫與協助。 https://hackmd.io/@kerwintsai/SkRTk6kCS https://hackmd.io/@nJ6Pd8tRQiaFL2jrZe6K7g/rkFPmNCH3 ## 環境準備 首先你需要安裝Homebrew Homebrew 套件管理器介紹 https://brew.sh/index_zh-tw 一、首先我們打開 Mac 的終端機輸入: ``` bash /usr/bin/ruby -e $(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install) ``` 他就會開始自己安裝了。 安裝完以後你可以接著輸入: ``` bash brew --version ``` 就會像下面一樣看到,brew 的版本 ![](https://i.imgur.com/sDfDFLT.png) **一些基本的操作** 1. ``brew install packahe_name`` -- 安裝套件 2. ``brew search`` -- 搜尋需要的套件 ## 正式開始安裝 ### 相依套件 首先開始自己 build 以前我們要先安裝 Allegro 5 的相依套件,那我們一樣用 brew 來安裝 終端機輸入: ```bash brew install dumb flac freetype libogg libvorbis opusfile physfs theora webp git cmake gcc ``` 安裝完成以後可以在 final project 的[資料夾中開啟終端機](https://blog.gtwang.org/mac-os/open-terminal-here-in-mac-os-finder/)。 首先先在終端機打上 `cd` 然後將 `final_project_bundle` 資料夾拖曳進終端機( [cd 指令介紹](https://www.ibm.com/docs/zh-tw/aix/7.1?topic=directories-changing-another-directory-cd-command) ) ![](https://hackmd.io/_uploads/rkNZgpb8h.png) 按下 enter 後就成功切換路徑。 :::spoiler allegro github 檔案 (optional) Allegro 的 github page https://github.com/liballeg/allegro5/releases/download/5.2.7.0/allegro-5.2.7.0.zip ::: 我們打開終端機輸入: 程設一: ```bash cd <Final project directory>/allegro_mac ``` 程設二: ```bash cd <Final project directory>/allegro_mac ``` 你會發現我們已經在 allegro_mac 這個資料夾內了 接下來我們在這邊新增一個編譯用的資料夾,通常來說我們會做這樣一個資料夾來讓編譯的檔案都放在一起,這樣可以有效的跟原本的 source code 隔離,如果我們想要清理環境,就只要刪除 build 這個資料夾就好了 終端機輸入: ```bash mkdir build cd build ``` ### 編譯 接下來進入編譯過程,首先要做的事情就是 configure Allegro 終端機輸入: ```bash cmake .. ``` ![](https://i.imgur.com/a1vRn1S.png) configure 完成後就可以開始編譯,這裏會用到 make 指令,至於這個指令工作的機制稍後會提到 終端機輸入: ```bash make ``` ![](https://i.imgur.com/5Jh6EgC.jpg) ![](https://i.imgur.com/0gGTP7Z.jpg) build 完以後我們要來安裝他。 終端機輸入: ```bash sudo make install ``` 這時候需要輸入你的密碼 :::warning 注意! 密碼不會出現在螢幕上 ::: ![](https://i.imgur.com/W5SUrbq.jpg) 他會把需要的檔案裝在 ``/usr/local/lib`` 裡面,header檔則是在 ``/usr/local/include/`` 底下。 ## 在 Mac 上使用 Allegro 5 原本在 Xcode 上面按下一個按鈕就可以編譯這種美好的事情現在不可能拉。 但是還是有好用的IDE可以用的~ 那就是 VScode 拉 ![](https://i.imgur.com/94EuMZe.png =200x200) 至於要怎麼裝就請到官網去看 https://code.visualstudio.com/ 然後我們需要安裝C/C++的插件 按下左邊這個按鈕 ![](https://i.imgur.com/pF8qOwe.png) 搜尋 C/C++,點擊安裝 ![](https://i.imgur.com/nfoemtD.jpg) 介面看起來大概像這個樣子~ ![](https://i.imgur.com/g3SGy4l.jpg) 接下來我們要來講解編譯的事情,你能夠用 Allegro 這個 libiarrays 的內容來寫扣是且執行是因為你在編譯的時候,編譯器可以找到相對應的函數來把你的程式轉成電腦看得懂的語言,這是在 linker 時期完成的(有興趣的同學可以自己來這邊了解編譯器的運作過程 https://medium.com/@aesl/understanding-compilers-for-humans-ba970e045877)。 其實不只是 Allegro ,還記得每次寫扣前都要載入的標頭檔嗎? 你可以使用 ``printf`` 這些函數的原因也是因為如此。 C Complier 之所以可以幫你翻譯 ``printf`` 是因為他認得 ``printf`` 這個東西是在 stdio.h 這個函式庫裡被定義的。 但是 Complier 並不認得 allegro/allegro.h 這個函式庫,那這時候我們就要手動告訴他,因此我們需要一個工具。 ### pkg-config pkg-config 是一個在原始碼編譯時查詢已安裝的庫的使用介面的電腦工具軟體。pkg-config 原本是設計用於 Linux 的,但現在在各個版本的 BSD、windows、Mac OS X 和 Solaris 上都有著可用的版本。 它輸出已安裝的庫的相關資訊,包括: - C/C++ 編譯器需要的輸入參數 - 連結器需要的輸入參數 - 已安裝軟體包的版本資訊 一如往常的,我們先來安裝他, 終端機輸入: ```bash brew install pkg-config ``` 然後在 terminal 中更改環境變數 `PKG_CONFIG_PATH`, 終端機輸入: ```bash export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig ``` 當你輸入下面這個指令 ``pkg-config --libs allegro-5`` 的時候你就會發現,他吐回給你一個路徑,這就是 Allegro 的 object file 和 header file 擺放的地方。 終端機輸入: ```bash pkg-config --libs allegro-5 ``` ### Makefile 網路上有不少教學例如 https://ccckmit.gitbooks.io/lowlevelc/content/makefile.html 我相信這對同學來說有點難,不過沒關係能夠理解就理解,如果不行就照抄我給的範例。 但是還是希望你把下面的內容看完,因為這樣你才知道要改什麼內容。 #### template 的 makefile 以下是這次 Final project 給的 makefile ```make= ALLEGRO_LIBRARIES := allegro-5 allegro_image-5 allegro_font-5 allegro_ttf-5 allegro_dialog-5 allegro_primitives-5 allegro_audio-5 allegro_acodec-5 allegro_video-5 ALLEGRO_FLAGS := $(shell pkg-config --cflags --libs "$(ALLEGRO_LIBRARIES) <= 5.2.7") -lallegro CC := gcc OUT:= game MAIN:= mac_main.c GameWindow.c scene.c global.c charater.c all: $(MAIN) $(CC) -o $(OUT) $(MAIN) $(ALLEGRO_FLAGS) clean: rm $(OUT) ``` 可以觀察到,我們把 ``ALLEGRO_LIBRARIES`` , ``ALLEGRO_FLAGS`` 就是拿來定義編譯的參數 比較需要注意的是,``MAIN`` 和 ``OUT`` 這個參數。他們分邊定義了 .c 檔的名稱以及輸出檔案的名稱。就根據你現在的檔案名稱來更改,其餘的東西都不用動。 要編譯執行時, 終端機輸入: ```bash make ./game ``` 就可以了 那如果想要刪掉最後輸出的執行檔的話, 終端機輸入: ```bash make clean ``` 就好了~~~ #### tutorial 的 makefile 要先 `cd` 進入 tutorial 的資料夾 終端機輸入: ```bash cd tutorial ``` tutorial 裡的 makefile 在 `ALLEGRO_LIBRARIES :=` 後面有加上 `allegro_video-5` 所以才可以用 video 相關 allegro function ```make= ALLEGRO_LIBRARIES := allegro-5 allegro_image-5 allegro_font-5 allegro_ttf-5 allegro_dialog-5 allegro_primitives-5 allegro_audio-5 allegro_acodec-5 allegro_video-5 ALLEGRO_FLAGS := $(shell pkg-config --cflags --libs "$(ALLEGRO_LIBRARIES) <= 5.2.7") -lallegro -lallegro_main CC := gcc OUT:= task6.out # 編譯完的執行檔的名字(可以自己設定) MAIN:= task_6.c # 要編譯的task檔案名稱 all: $(MAIN) $(CC) -o $(OUT) $(MAIN) $(ALLEGRO_FLAGS) clean: rm $(OUT) ``` 用terminal編譯執行,終端機輸入: ```bash make ./task6.out ``` 對於 task7 由於有用到 algif5 的 function(播放 gif),因此需要跟 template 裡面的 algif5 檔案一起編譯 makefile 需要加上 algif5 檔案的路徑: ```cpp= ALLEGRO_LIBRARIES := allegro-5 allegro_image-5 allegro_font-5 allegro_ttf-5 allegro_dialog-5 allegro_primitives-5 allegro_audio-5 allegro_acodec-5 allegro_video-5 ALLEGRO_FLAGS := $(shell pkg-config --cflags --libs "$(ALLEGRO_LIBRARIES) <= 5.2.7") -lallegro -lallegro_main CC := gcc OUT:= task7_ans MAIN:= task7_ans.c ../algif5/src/algif.c ../algif5/src/bitmap.c ../algif5/src/gif.c ../algif5/src/lzw.c all: $(MAIN) $(CC) -o $(OUT) $(MAIN) $(ALLEGRO_FLAGS) clean: rm $(OUT) ``` 用terminal編譯執行,終端機輸入: ```bash make ./task7.out ``` 希望各位同學可以順利的寫完 final project ### 程設二的部分 Makefile ```make= CC := g++ CFLAGS := -Wall -std=c++17 -O2 -v ALLEGRO_LIBRARIES := allegro-5 allegro_image-5 allegro_font-5 allegro_ttf-5 allegro_dialog-5 allegro_primitives-5 allegro_audio-5 allegro_acodec-5 ALLEGRO_FLAGS := $(shell pkg-config --cflags --libs $(ALLEGRO_LIBRARIES)) -lallegro -lallegro_main OUT:= game SOURCE = Main.cpp Attack.cpp Circle.cpp GameWindow.cpp global.cpp Level.cpp Menu.cpp Monster.cpp Slider.cpp Tower.cpp OBJ = Main.o Attack.o Circle.o GameWindow.o global.o Level.o Menu.o Monster.o Slider.o Tower.o all: $(CC) -c -g $(CFLAGS) $(SOURCE) $(ALLEGRO_FLAGS) $(CC) $(CFLAGS) -o $(OUT) $(OBJ) $(ALLEGRO_FLAGS) rm $(OBJ) .PHONY:clean clean: rm $(OUT) ``` ## 常見問題 - missing separator. Stop.的錯誤 - 打 tab 不要 space - 有可能 tab 會被 space 替換,記得去 vscode 下方換 - mangle main: ```c++ #define ALLEGRO_NO_MAGIC_MAIN int real_main(int argc, char **argv) { ... } int main(int argc, char **argv){ return al_run_main(argc, argv, real_main); } ``` 把 -lallegro_main 刪掉 - LD library - export DYLD_LIBRARY_PATH=/usr/local/lib:$DYLD_LIBRARY_PATH - Cmake list -