gpt4 book ai didi

visual-studio - 在 C 程序中嵌入 Tcl

转载 作者:行者123 更新时间:2023-12-02 02:36:08 34 4
gpt4 key购买 nike

我正在尝试创建一个简单的 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 发行版解决了我的问题。

最佳答案

您的错误消息告诉我们您需要一个 stub 表(一旦所有宏都展开,Tcl 的名称为 tclStubPtr),这又表明定义预处理器符号 USE_TCL_STUBS 。该符号适用于您正在编写为 Tcl 提供额外功能的库的情况。但是,如果您正在编写一个调用 Tcl 库中的函数的主应用程序(例如“运行此代码”),则无法(轻松)使用 stub 机制,因为在 Tcl 之前需要 stub 表我们能够为您提供。

解决办法是定义USE_TCL_STUBS并链接到主Tcl库(可能C:\Tcl\lib\tcl85.dll > 在您的系统上)而不是 tclstub85.lib。 (我对设置 Visual Studio 的了解不够,无法说出该配置的详细信息。)

<小时/>

您还应该在调用 Tcl_CreateInterp() 之前将此行添加到代码中:

Tcl_FindExecutable(NULL);

该调用用于允许 Tcl 库核心进行自身初始化,执行一些小操作,例如使内存管理器和文件系统接口(interface)层正常工作。

关于visual-studio - 在 C 程序中嵌入 Tcl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13402536/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com