在 C 程序中使用 tcl 和 tk 存根

2024-04-14

我需要一个简单的 C 程序来创建 tcl 解释器,初始化 tcl 和 tk,然后加载给定的 tcl/tk 脚本。我想使用 tcl 和 tk 存根(以确保程序将在具有不同版本的 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, you 不应该使用存根。相反,构建时无需USE_TCL_STUBS and USE_TK_STUBS定义和链接libtcl.so and libtk.so(好吧,不管它们附加了什么版本号)。由于 Unix 链接器的特殊性,您应该将 Tk 库放在 Tcl 库之前(并且您可能还需要手动链接其他库,例如 X 库;链接有时有点像魔术)。

背景说明

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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 C 程序中使用 tcl 和 tk 存根 的相关文章

  • c和java语言中的换行符

    现在行分隔符取决于系统 但在 C 程序中我使用 n 作为行分隔符 无论我在 Windows 还是 Linux 中运行它都可以正常工作 为什么 在java中 我们必须使用 n 因为它与系统相关 那么为什么我们在c中使用 n 作为新行 而不管我
  • 如何读取扩展文件属性/文件元数据

    因此 我按照教程使用 ASP net core 将文件 上传 到本地路径 这是代码 public IActionResult About IList
  • std::cout 和 std::wcout 有什么区别?

    在c 中 有什么区别std cout and std wcout 它们都控制流缓冲区的输出或将内容打印到控制台 或者它们只是相似吗 它们作用于不同的字符类型 std cout uses char作为字符类型 std wcout uses w
  • Unix网络编程澄清

    我正在翻阅这本经典书籍Unix网络编程 https rads stackoverflow com amzn click com 0139498761 当我偶然发现这个程序时 第 6 8 节 第 179 180 页 include unp h
  • 如何将 #ifdef DEBUG 添加到 Xcode?

    我的项目中有一些代码永远不应该在发布版本中使用 但在测试时很有用 我想做这样的事情 ifdef DEBUG Run my debugging only code endif 在 Xcode 4 中哪里添加 DEBUG 设置 我尝试将其放入
  • 在 Unity 进程和另一个 C# 进程之间进行本地 IPC 的最快方法 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我希望每秒大约 30 次从 C 应用程序向我的 Unity 应用程序传送大量数据 由于 Unity 不支持映射内存和管道 我考虑了 t
  • XamlReader.Load 在后台线程中。是否可以?

    WPF 应用程序具有从单独的文件加载用户控件的操作 使用XamlReader Load method StreamReader mysr new StreamReader pathToFile DependencyObject rootOb
  • 读取文件特定行号的有效方法。 (奖励:Python 手册印刷错误)

    我有一个 100 GB 的文本文件 它是来自数据库的 BCP 转储 当我尝试导入它时BULK INSERT 我在第 219506324 行上收到一个神秘错误 在解决此问题之前 我想看看这一行 但可惜的是我最喜欢的方法 import line
  • 如何从 .resx 文件条目获取注释

    资源文件中的字符串有名称 值和注释 The ResXResourceReader类让我可以访问名称和值 有办法看评论吗 你应该能够得到Comment via ResXDataNode class http msdn microsoft co
  • C++中的类查找结构体数组

    我正在尝试创建一个结构数组 它将输入字符串链接到类 如下所示 struct string command CommandPath cPath cPathLookup set an alarm AlarmCommandPath send an
  • 将 System.Windows.Input.KeyEventArgs 键转换为 char

    我需要将事件参数作为char 但是当我尝试转换 Key 枚举时 我得到的字母和符号与传入的字母和符号完全不同 如何正确地将密钥转换为字符 这是我尝试过的 ObserveKeyStroke this new ObervableKeyStrok
  • 在 C# 中循环遍历文件文件夹的最简单方法是什么?

    我尝试编写一个程序 使用包含相关文件路径的配置文件来导航本地文件系统 我的问题是 在 C 中执行文件 I O 这将是从桌面应用程序到服务器并返回 和文件系统导航时使用的最佳实践是什么 我知道如何谷歌 并且找到了几种解决方案 但我想知道各种功
  • Rx 中是否有与 Task.ContinueWith 运算符等效的操作?

    Rx 中是否有与 Task ContinueWith 运算符等效的操作 我正在将 Rx 与 Silverlight 一起使用 我正在使用 FromAsyncPattern 方法进行两个 Web 服务调用 并且我想这样做同步地 var o1
  • 未定义的行为或误报

    我 基本上 在野外遇到过以下情况 x x 5 显然 它可以在早期版本的 gcc 下编译干净 在 gcc 4 5 1 下生成警告 据我所知 警告是由 Wsequence point 生成的 所以我的问题是 这是否违反了标准中关于在序列点之间操
  • 使用 Moq 使用内部构造函数模拟类型

    我正在尝试模拟 Microsoft Sync Framework 中的一个类 它只有一个内部构造函数 当我尝试以下操作时 var fullEnumerationContextMock new Mock
  • 等待线程完成

    private void button1 Click object sender EventArgs e for int i 0 i lt 15 i Thread nova new Thread Method nova Start list
  • .NET中的LinkedList是循环链表吗?

    我需要一个循环链表 所以我想知道是否LinkedList是循环链表吗 每当您想要移动列表中的 下一个 块时 以循环方式使用它的快速解决方案 current current Next current List First 电流在哪里Linke
  • 如何在按钮单击时模拟按键 - Unity

    我对 Unity 中的脚本编写非常陌生 我正在尝试创建一个按钮 一旦单击它就需要模拟按下 F 键 要拾取一个项目 这是我当前的代码 在编写此代码之前我浏览了所有统一论坛 但找不到任何有效的东西 Code using System Colle
  • 线程和 fork()。我该如何处理呢? [复制]

    这个问题在这里已经有答案了 可能的重复 多线程程序中的fork https stackoverflow com questions 1235516 fork in multi threaded program 如果我有一个使用 fork 的
  • 使用 GROUP 和 SUM 的 LINQ 查询

    请帮助我了解如何使用带有 GROUP 和 SUM 的 LINQ 进行查询 Query the database IEnumerable

随机推荐

  • java - 使用 Apache PDFBox 生成 unicode pdf

    我必须在我的 spring mvc 应用程序中生成 pdf 最近我测试了iTextPdf 库 http itextpdf com 但我无法生成 unicode pdf 文档 事实上 我在生成的文档中没有看到非拉丁字符 我决定使用 Apach
  • Angular.js - 使用 ng-options 将类添加到选项

    有人问过类似的问题 如何在带有 ng options 的 select 中使用 ng class https stackoverflow com questions 15264051 how to use ng class in selec
  • 多次迭代

    有没有一种更简单 更简洁的方法来编写这样的代码 1 10 each do i 1 10 each do j 1 10 each do k 1 10 each do l puts i j k l end end end end 理想情况下我能
  • 如何在 GCC x86 中使用 RDTSC 计算时钟周期? [复制]

    这个问题在这里已经有答案了 使用 Visual Studio 我可以从处理器读取时钟周期计数 如下所示 我如何对 GCC 做同样的事情 ifdef MSC VER Compiler Microsoft Visual Studio ifdef
  • 如何从 SearchView 中移除焦点?

    我想从中删除焦点和文本SearchView in onResume I tried searchView clearFocus 但它不起作用 这是我的 xml 代码
  • Zclip 在 jsfiddle 上工作但不能在本地工作?

    真奇怪 杰斯小提琴 http jsfiddle net sxeCM 4 http jsfiddle net sxeCM 4 在职的 本地具有相同的代码
  • 在呈现的模态视图控制器上按下时允许菜单按钮退出 tvOS 应用程序

    我有一个 tvOS 应用程序 带有UITabBarController作为主故事板的主要入口点 如果用户未登录 则UITabBarController提出了一个LoginViewController模态地 当用户按下 Siri 遥控器上的菜
  • 按频率对字符串数组进行排序的最有效方法

    我有一个字符串数组 String stringArray x y z x x y a 将其订购为更小的最快 最有效的方法是什么Collection按照每个频率的顺序String是和它的频率有关吗 我想使用String作为一个关键HashMa
  • 水平拉伸 ul 以适合 div 的宽度

    对于我网站的主导航 有一个 980px 宽的 div 和一个用于主导航链接的 ul 我试图使导航链接拉伸以均匀地适应 div 的宽度 div style width 100 ul li a href Nav Item a li li a h
  • UITableView 单元格用虚线分隔

    我想将分隔符从 UITableView 更改为虚线 我能找到的只是 UITableViewCellSeparatorStyleBlabla 我可以放别的东西代替吗 我宁愿不使用图像 但如果没有其他方法 Thanks 尝试以下解决方案 sel
  • JPA 和 Hibernate 中 @MapKey、@MapKeyColumn 和 @MapKeyJoinColumn 之间的区别

    As per 休眠文档 http docs jboss org hibernate orm 4 3 manual en US html ch07 html 如果我们想使用 Map 作为实体之间的关联 有多个可用的注释 医生说 或者 映射键被
  • Simplecov 报告忽略 /app 目录中的文件夹

    我使用 simplecov 来测量 Rails 4 0 11 应用程序的覆盖范围 我使用 Ruby 2 0 0 我注意到 app 的一些子文件夹被 simplecov 忽略 我不明白为什么 test helper rb require si
  • X11原子XA_WM_NAME和“_NET_WM_NAME”有什么区别吗?

    与定义的原子有什么区别吗XA WM NAME定义于Xatom h那个人开始使用XInternAtom display NET WM NAME False 编辑 我制作了一个小程序来打印两者的整数值 我得到 NET WM NAME 312 X
  • 使用 LINQ 查询 DataColumnCollection

    我正在尝试对 DataTable 的 Columns 属性执行简单的 LINQ 查询 from c in myDataTable Columns AsQueryable select c ColumnName 然而 我得到的是这样的 找不到
  • 如何生成圆形分布中的随机点

    我想知道如何生成出现在圆形分布中的随机数 我能够在矩形分布中生成随机点 以便这些点在 0 我将如何继续生成圆内的点 以便 x 500 2 y 500 2 import random import math radius of the cir
  • java中将图像向右旋转90度

    我无法将图像向右旋转 90 度 我需要能够在java中单独旋转图像 唯一的事情 不幸的是 我需要在特定点绘制图像 并且没有带有参数的方法 1 单独旋转图像 2 允许我设置 x 和 y 任何帮助表示赞赏 public class Tumble
  • 防止 JavaScript 文件缓存

    我试图阻止浏览器缓存 2 个 JavaScript 文件 我尝试过使用没有成功 这是我的元素代码
  • 最小操作码大小 x86-64 strlen 实现

    我正在研究最小操作码大小x86 64 strlen我的代码高尔夫 二进制可执行文件的实现不应超过一定的大小 为简单起见 请考虑 demoscene 总体思路来自于here http www int80h org strlen 尺寸优化思路来
  • 显式模板专业化

    我不想问这样一个笼统的问题 但下面的代码是显式模板专业化的练习 我不断收到错误 c users documents visual studio 2010 projects template array template array arra
  • 在 C 程序中使用 tcl 和 tk 存根

    我需要一个简单的 C 程序来创建 tcl 解释器 初始化 tcl 和 tk 然后加载给定的 tcl tk 脚本 我想使用 tcl 和 tk 存根 以确保程序将在具有不同版本的 tcl tk 的计算机上运行 我将使用这个程序而不是运行wish