gpt4 book ai didi

c - 在 C 程序中使用 tcl 和 tk stub

转载 作者:行者123 更新时间:2023-12-04 09:28:00 25 4
gpt4 key购买 nike

我需要一个简单的 C 程序来创建 tcl 解释器,初始化 tcl 和 tk,然后加载给定的 tcl/tk 脚本。我想使用 tcl 和 tk stub (以确保程序将在具有不同版本的 tcl/tk 的计算机上运行)。我将使用这个程序而不是运行 wish(因为我有可移植性问题)。

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

int AppInit(Tcl_Interp *interp) {
if(Tcl_Init(interp) == TCL_ERROR) return TCL_ERROR;
if(Tk_Init(interp) == TCL_ERROR) return TCL_ERROR;
Tcl_EvalFile(interp,"myscript.tcl");
return TCL_OK;
}

int main(int argc, char *argv[]) {
Tk_Main(argc, argv, AppInit);
return 0;
}

我尝试使用以下命令编译(在 GNU/Linux 上)。程序编译没有错误,但随后因段错误而停止。

gcc -I/usr/include/tcl8.5 -DUSE_TCL_STUBS -DUSE_TK_STUBS -o main.exe ../main.c /usr/lib/libtclstub.a /usr/lib/libtkstub.a

最佳答案

tl;dr

使用main 编译程序时,您不应该 使用 stub 。相反,构建时不使用 USE_TCL_STUBSUSE_TK_STUBS 定义并链接到 libtcl.solibtk.so(好吧,附有任何版本号)。由于 Unix 链接器的特殊性,您应该将 Tk 库放在 Tcl 库之前(您可能还需要手动链接到其他库,例如 X 库;链接有时是一种黑色艺术)。

背景说明

stub 机制旨在允许 Tcl 扩展库使用 Tcl 的(和 Tk 的)C API,而不必链接到 Tcl 库本身。这意味着该库不知道在加载它的过程中存在什么确切的 Tcl 版本,而是仅取决于特定版本的 Tcl API(Tcl 非常擅长管理长期 API 和 ABI 兼容性)。然而,这一切都取决于使用一种非常特殊的指针调用库初始化函数,该指针允许查找所有其他 API 函数。 (一旦 Tcl 以这种方式被引导,找到所有其他 API 就变得容易得多。)当像您一样创建应用程序时,您会遇到一个问题,因为没有现有的引导 Tcl 库实例供您的代码链接;它必须直接链接(事实上 Tcl_MainTk_Main 都是非 stub 函数,正是出于这个原因)。

那些在家阅读的人可能会认为这是 Tcl 重复了系统动态链接器所做的很多事情。你是对的。然而,系统动态链接器有很多方法可以做一些不太正确的事情(例如,当有多个版本的库时,它会变得非常困惑)并且它会微妙地变化在平台之间的能力。 Tcl 使用它自己的机制,因为这使得它在任何地方都能精确地(对于 Tcl)工作,让我们更好地控制长期 ABI 兼容性。

上述关于 stub 的规则有一个异常(exception),那就是tclkit ,这是单个文件中的完整 Tcl 和 Tk 运行时(加上一个小的 NoSQL DB)。 tclkit 的引导代码非常复杂;你不想处理那些你不必处理的事情!如果您想要一个单文件 Tcl 运行时,您可以使用 tclkit(或其他少数几个可以做几乎相同事情的系统之一)。

关于c - 在 C 程序中使用 tcl 和 tk stub ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11046935/

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