4

我正在嘗試創建一個調用腳本的nagelfar語法檢查器的簡單C++控制檯應用程序。我遵循這裏的指示:http://wiki.tcl.tk/19919,將tclstub85.lib添加到我的輸入中,將tcl lib目錄添加到我的其他庫中,並添加我的頭文件目錄。連接失敗:在C程序中嵌入Tcl

main.obj : error LNK2001: unresolved external symbol _tclStubsPtr 

這是用於連接我的命令行:

/OUT:"C:\Users\######\Documents\Visual Studio 2005\Projects\Nagelfar\Release\Nagelfar.exe" 
/NOLOGO /LIBPATH:"C:\Tcl\lib" /MANIFEST 
/MANIFESTFILE:"Release\Nagelfar.exe.intermediate.manifest" /DEBUG 
/PDB:"c:\users\######\documents\visual studio 2005\projects\nagelfar\release\Nagelfar.pdb" 
/OPT:REF /OPT:ICF /LTCG /MACHINE:X86 /ERRORREPORT:PROMPT C:\Tcl\lib\tclstub85.lib 
kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib 
shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib 

這是完整的源代碼,這是我可以編譯並在Linux下用克運行良好++:

#include <stdlib.h> 
#include <stdio.h> 
#include <tcl.h> 
#include <string.h> 

Tcl_Interp * tcl_interp ; 
char fileToCheck[] = "test.tcl"; 
char dbFile[] = "syntaxdb.tcl"; 

int main() { 
    int code, argc; 
    const char **argv; 
    char command[1024]; 
    char *results = NULL; 
    tcl_interp = Tcl_CreateInterp(); 
    Tcl_SetVar2(tcl_interp, "::Nagelfar", "embedded", "1", 0); 
    code = Tcl_EvalFile(tcl_interp, "nagelfar.tcl"); 
    Tcl_LinkVar(tcl_interp, "::Nagelfar(chkResult)", (char *)&results, TCL_LINK_STRING); 
    sprintf(command, "synCheck %s %s", fileToCheck, dbFile); 
    code = Tcl_Eval(tcl_interp, command); 
    printf("Raw Result: \r\n %s\r\n", results); 
    code = Tcl_SplitList(tcl_interp, results, &argc, &argv); 
    { 
     int i; 
     for (i = 0; i < argc; ++i) 
     { 
      printf("%d/%d: %s\r\n", i+1, argc, argv[i]); 
     } 
    } 
    Tcl_Free(results); 
    return 0; 
} 

解決了我自己的問題:我有64位的ActiveTcl,但連接了一個32位的項目。使用x86 ActiveTcl分發解決了我的問題。

+0

請將您的解決方案作爲您自己問題的答案。它可能有助於未來的遊客。 –

+0

當然,但我不能再花幾個小時= D – bodangly

回答

1

解決了我自己的問題:我有64位ActiveTcl,但連接了一個32位項目。使用x86 ActiveTcl分發解決了我的問題。

1

您的錯誤消息告訴我們您期待存在一個存根表(一旦所有宏被展開,Tcl的名稱將會變爲tclStubPtr),這反過來又說定義了預處理符號USE_TCL_STUBS。該符號適用於您正在編寫向Tcl提供額外功能的庫的情況。但是,如果您正在編寫一個調用Tcl庫中的函數的主應用程序(例如「運行此代碼」),則無法(輕鬆)使用存根機制,因爲您需要在Tcl之前存根表能夠提供給您。

解決方法是定義USE_TCL_STUBS和對主Tcl庫(可能是您的系統上C:\Tcl\lib\tcl85.dll)鏈接,而不是tclstub85.lib。 (我不知道有足夠的瞭解建立Visual Studio中說什麼配置的細節。)


你也應該這樣行之前調用添加到您的代碼Tcl_CreateInterp()

Tcl_FindExecutable(NULL); 

這一呼籲是用來讓Tcl庫核心初始化自己,做小東西,喜歡把自己的內存管理和文件系統接口層工作。

+0

謝謝,我發現我不應該使用存根,但我的問題的根源是我下載了一個64位的Tcl庫,但有一個32位項目。 – bodangly

+0

@user Oooh是的,這是行不通的。 (Stubs是一個很棒的技術,但它並沒有試圖解決所有的問題,這真的是一件好事,因爲做一件事情比很多事情要好得多。:-)) –