4

スクリプトでnagelfar構文チェッカーを呼び出す単純なc++コンソールアプリを作成しようとしています。http://wiki.tcl.tk/19919の指示に従い、入力にを追加tclstub85.libし、追加のライブラリにtcl libディレクトリを追加し、ヘッダーディレクトリも追加しました。リンクは次の場合に失敗します:

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 

これは完全なソースコードであり、g++を使用して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;
}

私自身の問題を解決しました:x64 ActiveTclを使用していましたが、32ビットプロジェクトをリンクしていました。x86 ActiveTclディストリビューションを使用すると、問題が修正されました。

4

2 に答える 2

1

エラーメッセージは、スタブテーブル(tclStubPtrすべてのマクロが展開されるとTclは名前で呼ばれる)を期待していることを示しています。これは、プリプロセッサシンボルを定義していることを示していますUSE_TCL_STUBS。このシンボルは、Tclに追加機能を提供するライブラリを作成する場合に使用します。ただし、「このコードを実行する」など、Tclライブラリの関数を呼び出すメインアプリケーションを作成している場合、Tclの前にスタブテーブルが必要になるため、スタブメカニズムを(簡単に)使用することはできません。あなたにそれを提供することができる立場にあります。

修正は、の代わりにメインのTclライブラリ(おそらくシステム上)を定義せ、リンクすることです。(Visual Studioのセットアップについて、その構成の詳細を説明するのに十分な知識はありません。)USE_TCL_STUBSC:\Tcl\lib\tcl85.dlltclstub85.lib


また、 :を呼び出す前に、この行をコードに追加する必要があります。Tcl_CreateInterp()

Tcl_FindExecutable(NULL);

この呼び出しは、Tclライブラリコアがそれ自体を初期化できるようにするために使用され、メモリマネージャーやファイルシステムインターフェイスレイヤーを機能させるなどの小さなことを行います。

于 2012-11-16T12:02:43.777 に答える
1

私自身の問題を解決しました:x64 ActiveTclを使用していましたが、32ビットプロジェクトをリンクしていました。x86 ActiveTclディストリビューションを使用すると、問題が修正されました。

于 2013-08-27T14:14:55.500 に答える