crystal的c binding確實(shí)挺好用
如題,在下稍微使用了一下crystal的c binding功能,發(fā)現(xiàn)確實(shí)挺好用(要是lib聲明可以根據(jù)頭文件自動(dòng)生成就更好了)
上一篇提到了因?yàn)闀?huì)稍微用點(diǎn)兒圖形的東西,所以沒(méi)有在wsl安裝crystal,這里說(shuō)到的圖形的東西就是本期要使用到的c庫(kù)
以下均為在下根據(jù)官方的sdl binding例子自己踩坑,踩出來(lái)的
創(chuàng)建一個(gè)c binding很簡(jiǎn)單,只需要三步,顯式鏈接這個(gè)庫(kù),編寫(xiě)外部函數(shù),將這個(gè)庫(kù)放進(jìn)crystal的lib文件夾(這一步不能忘記,否則就會(huì)出鏈接問(wèn)題,crystal不能直接去你的path里面找你的c庫(kù)目錄的)
首先是安裝我們需要用的c庫(kù),這里在下選擇raylib,一個(gè)算是比較經(jīng)典的游戲工具庫(kù)(這個(gè)庫(kù)的安裝在c庫(kù)當(dāng)中算是相當(dāng)友好了,它甚至給你提供了一個(gè)使用zig為編譯器的交叉編譯方案,具體可以看src目錄下的build.zig)
對(duì)于在下老Windows用戶了(指在Windows下編程有些許年份了),vcpkg還是得有一個(gè)的,如果各位同樣有vcpkg,那么只需要vcpkg install raylib:x64-windows(不喜歡64位的可以安裝32位的,但可能會(huì)和crystal產(chǎn)生沖突,具體的在下沒(méi)有試過(guò)不好斷言),vcpkg本身是跨平臺(tái)的,所以各平臺(tái)應(yīng)當(dāng)是一樣的
對(duì)于使用zig的,也可以用zig build xxx(編譯方案名稱,可以查看一下build.zig文件看看,在下相信安裝了zig的應(yīng)該都是會(huì)zig的,否則你安裝它干什么對(duì)不對(duì)),記得把編譯出來(lái)的庫(kù)放到對(duì)應(yīng)的位置就好
官方推薦的安裝方式還有premake(一個(gè)由lua編寫(xiě)的c項(xiàng)目編譯工具)
當(dāng)然以上都是windows平臺(tái)下的方式(為啥堅(jiān)持使用Windows?因?yàn)楦F咯,一臺(tái)電腦工作和娛樂(lè)都是它,要知道在下于steam中點(diǎn)擊linux支持以后可是庫(kù)瞬間消失大半),如果你是linux或者macos那么應(yīng)該系統(tǒng)自帶的工具就能裝,這里也就不多說(shuō)了
我們的目標(biāo)是讓一個(gè)最基本的raylib項(xiàng)目可以跑起來(lái),那么首先是我們預(yù)期的程序應(yīng)當(dāng)是這樣的:
整個(gè)程序基本是將c/c++版本的翻譯成了crystal,足夠簡(jiǎn)單的同時(shí)也能基本上了解c binding的流程
那么,我們從鏈接并定義lib開(kāi)始,以下代碼我們這個(gè)程序所需要用到的所有東西的lib定義,由于我們本次只是演示,如果將整個(gè)庫(kù)完整的binding寫(xiě)完再發(fā)出來(lái),那么估計(jì)可能我就終于記起來(lái)b站密碼了
首先是手動(dòng)聲明要鏈接的庫(kù),這里必須與你放入lib文件夾內(nèi)的庫(kù)文件xxx.lib中的xxx相同(在windows下是raylib.lib可不代表別的系統(tǒng)也為同名)
然后是lib block,內(nèi)部需要將來(lái)自外部的函數(shù)和類型聲明為crystal的,注意,這里不能使用基礎(chǔ)類型以外的類型(因?yàn)槟切┦莄沒(méi)有的類型),可惜的是在下沒(méi)有在官網(wǎng)找到類似cgo和rust ffi那樣的與c的類型的對(duì)照表,但如果你使用了不允許的類型,編譯時(shí)會(huì)報(bào)錯(cuò),多逝幾次就差不多都知道了
這里定義了一個(gè)Color的struct類型對(duì)應(yīng)下面drawText需要使用的Color類型,注意,這里的struct和crystal的struct不同,是c的struct,而且需要與庫(kù)內(nèi)部的定義相符,這里原庫(kù)的Color就是rgba,類型為unsigned char,也就是u8
然后是函數(shù)部分,這里也沒(méi)有什么特別的,就是以fun關(guān)鍵字定義函數(shù),后面為在c那一頭的定義,類型應(yīng)當(dāng)與c那邊的相符(這就是沒(méi)有類型對(duì)照會(huì)很難受的主要原因)
可以看到我們這里并沒(méi)有定義那個(gè)常量,因?yàn)檫@里的struct沒(méi)辦法以常規(guī)的方式(crystal的常規(guī))使用,我們?nèi)绻枰x這個(gè)常量就需要封裝一下,這里就來(lái)到了一個(gè)不強(qiáng)制要求的步驟了,那就是,在這個(gè)lib之上再封裝一層
此時(shí)我們?yōu)閏olor封裝了一層,并在調(diào)用下層的時(shí)候?yàn)殡[藏了轉(zhuǎn)換類型的步驟
在windows下還需要記住一點(diǎn),xxx.lib也是鏈接,你還得把raylib的動(dòng)態(tài)庫(kù)放在path或者當(dāng)前項(xiàng)目的根目錄下,別的平臺(tái)應(yīng)該簡(jiǎn)單不少
運(yùn)行一下:

以上,crystal的c binding設(shè)計(jì)的確實(shí)挺合理清晰的,感興趣的可以試試