# 在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 的版本  **一些基本的操作** 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) )  按下 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 .. ```  configure 完成後就可以開始編譯,這裏會用到 make 指令,至於這個指令工作的機制稍後會提到 終端機輸入: ```bash make ```   build 完以後我們要來安裝他。 終端機輸入: ```bash sudo make install ``` 這時候需要輸入你的密碼 :::warning 注意! 密碼不會出現在螢幕上 :::  他會把需要的檔案裝在 ``/usr/local/lib`` 裡面,header檔則是在 ``/usr/local/include/`` 底下。 ## 在 Mac 上使用 Allegro 5 原本在 Xcode 上面按下一個按鈕就可以編譯這種美好的事情現在不可能拉。 但是還是有好用的IDE可以用的~ 那就是 VScode 拉  至於要怎麼裝就請到官網去看 https://code.visualstudio.com/ 然後我們需要安裝C/C++的插件 按下左邊這個按鈕  搜尋 C/C++,點擊安裝  介面看起來大概像這個樣子~  接下來我們要來講解編譯的事情,你能夠用 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 -
×
Sign in
Email
Password
Forgot password
or
Sign in via Google
Sign in via Facebook
Sign in via X(Twitter)
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
Continue with a different method
New to HackMD?
Sign up
By signing in, you agree to our
terms of service
.