2015年9月21日 星期一

如何將TCL包到C的方式

【建立TCL Library】
要將TCL Library成功build,按照底下幾個步驟,以Windows為例:
  1. 準備好TCL 8.6.2 32bit的source code
  2. 執行.\tcl8.6.2\win底下的「vsvars32.bat」,確保環境為32bit
  3. 再利用console切換到「.\tcl8.6.2\win」底下,執行
    • nmake -f makefile.vc
    • 這邊主要是看有哪些選項設定可以用的,可以跳過
  4. 然後輸入底下就可以
    • 產生Release - nmake -f makefile.vc release
    • 產生Debug - nmake -f makefile.vc release OPT=symbols
  5. 關於使用,以Release來說,他產生的library名稱為「tcl86t.lib」,直接在VC++環境裡頭Link就好了
【使用TCL Library,並寫自己的TCL】
要將TCL包進C/C++裡頭,寫一個TCL的延伸,按照底下幾個步驟:

  1. 開一個DLL專案,將剛剛的library給Link進來
  2. 因為是DLL所以這樣宣告主要的function載入點:
    • EXTERN int Hello_Init(Tcl_Interp * interp);
    • 這個EXTERN是TCL內建的define,後面是你自己的名稱
  3. 為這個函式加入TCL元素,這個意思是,先Initial TCL環境,再確認版本,最後加入TCL command
    • 這邊加入的是"SayHello",意思是說,當進入TCL,畫面上輸入"SayHello"時,會去呼叫Hello_Cmd做出反應
    • if (Tcl_InitStubs(interp, TCL_VERSION, 0) == NULL)
                                       return TCL_ERROR;
      if (Tcl_PkgProvide(interp, "hello", VERSION) != TCL_OK)
                                      return TCL_ERROR;
                            Tcl_CreateObjCommand(interp, "SayHello", Hello_Cmd, NULL, NULL);
      return TCL_OK;
  4. 然後我們去寫Hello_Cmd function,這個Hello_Cmd必須遵照TCL的語法,這裡意思是說去顯示Hello, World在螢幕上:
    • static int Hello_Cmd(ClientData cdata, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[])
              {
                       Tcl_SetObjResult(interp, Tcl_NewStringObj("Hello, World!", -1));
                       return TCL_OK;
              }
  5. 我們的NuTCL-RM就是這樣擴充下去,分出很多命令,底下又帶子命令,完全是自己定義的。

沒有留言:

張貼留言