我正在尝试创建一个简单的c ++控制台应用程序,该应用程序在脚本上调用nagelfar语法检查程序。我按照这里的说明进行了操作: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发行版修复了我的问题。
答案 0 :(得分: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库核心初始化自己,做一些事情,比如让内存管理器和文件系统接口层工作。
答案 1 :(得分:1)
解决了我自己的问题:我有x64 ActiveTcl但是链接了一个32位项目。使用x86 ActiveTcl发行版修复了我的问题。