Emscripten 折騰日誌

系統程式的作業是要將之前寫的 C/C++ Program 轉成 JavaScript 放在網頁上面 Run,

聽起來還滿簡單的,不過卻甚是折騰,因為 Emscripten 就是個鍋。


對,沒錯,大鍋。


大到還不如直接重新寫份 JavaScript 還比較快。 _(:з」∠)_

當然啦,我的意思是假設你的 C/C++ Program 只有幾百行的話。


因為即使有 Emscripten,要做 Web Page Input 的接口,也是挺折騰的。

(如果有現成可以調的話,也是不難啦)


進入正題,來談談為什麼折騰吧,


============================================



首先是環境,

要選用 Linux 還是 Windows。

(我是窮學生,用不起 Mac,所以不用考慮 OSX) XD


LINUX 支線 =============================BAD END1=


Linux 我用的是之前裝在虛擬機的 Mint,

clang 和 llvm 裝好後,然後下載 Emscripten,我從官網下 portable。

編譯, 然後 clang 的動態連結庫就失效了,WTF。


這是一個剛買榔頭 (clang),開始作傢俱(Emscripten),敲第一下,榔頭就爆了的概念。


當時我的表情是這樣的。


也不是不想解決,但就是找不太到可用的 solution...


我試了第二遍,結果一樣,於是就換到 Windows 上。


畢竟不想再為難我的另一套 Linux (Antergos)。 QQ


WINDOWS 支線 ==========================GOOD END=


Windows 上要準備那些東西呢?


PythonNodeJS 還有 Emscripten Windows 的包。


Python , NodeJS 我是都剛好都有裝,所以 Emscripten 裝的還蠻順利的。


雖然安裝跑的有久,還幫你裝一些 VS 的東西,不過至少還可以用。


切到 C:\Program Files\Emscripten\emscripten\1.35.0 『版本號 1.35.0] 下可以測試。


emcc tests\hello_world.c


會跑出 a.out.js ,可以用


node a.out.js


測試。


hello, world!


接下來是折騰網頁的部分,


如果直接用 Browser run,他會用 prompt() 吃 Input,


重點是如果不按 ESC(按f12好像也會) 讓 prompt() 回傳 null,他會停不下來,


不過結果是吃到資料算完會馬上輸出到 console...


這部分他主要應該是模擬 console 比較底層的架構(用 prompt 模擬 buffer 吶)。


接下來要做的是用 textarea 吃 input,並直接 output 到網頁上。


一樣在 textarea 吃到沒有時,return null。


我在 stackoverflow 的 question edit 上得到了方法,並折騰了一番





然後上面沒提到的是關於 reload js files,


Emscripten run 過第一次後有些變數會改變,


不能再 run 第二次,這時就要 reload file,讓他重新宣告/設定變數。


但有個變數 reload 也不會被重設到,那就是 Module['calledRun']。


手動重新設定 Module['calledRun'] = undefined;


然後 reload js file


這些在我的作業裡都做好了,詳情可參照 SP HW4


會不會有同學看到這篇啊(笑


LINUX 支線 =============================BAD END2=


我不死心的又回到 Mint 上搞,把 portable 刪了,改下 GitHub 的版本。


發現我忘了裝 Node,但就算少 Node , clang 照理說也不會爆才對,


( 所以 clang 爆掉應該是 portable 的鍋 )


剛開始找不到 clang 路徑,結果發現是之前裝的刪不乾淨,


在家目錄留著之前的配置文件 .emscripten ,刪了,重裝,


我折騰了一番,裝好 Node 再來一次,這次好了, clang 沒爆,換噴 llvm 版本太舊,


至少要 3.9 版,我又折騰了一番, apt-get 上 3.9 好像升不太上去,於是我無所不用其極,


找了一些旁門左道,最後還是以失敗告終。


結論,Ubuntu 除非裝比較舊的 Emscripten,不然沒辦法用,因為 llvm 升不上去。


我 Antergos 也試了,我發現 Pacman 有 Emscripten 的包,直接下載下來,clang 也順便下了,


然後我 Pacman 就爆了,WTF,就爆了 QQ ,


是啥 openssl 的問題,我在折騰時確實有不小心升了一個 openssl 的包。


還能說甚麼呢,我 Antergos 也可能要再找個時間重裝了,因為感覺 Pacman 爛掉了,怎麼弄都弄不好 QQ。。





留言

這個網誌中的熱門文章

[Antergos] disable touchpad

[Editor] 入坑 Atom => Markdown 轉 PDF