1

我在 RHEL 机器上将 tcl 版本从 8.4 更改为 8.5.12 时遇到问题。我们的产品使用 TclDevKit 组件,如 Tcldom、Tclxml 等。我们也使用 Incr Tcl (Itcl)。我正在尝试在 Itcl 中创建 pkgIndex.tcl 文件,以便在需要该软件包时找到 Itcl,如下所示:

package ifneeded Itcl 3.4 [list load [file join $dir "libitcl-O.a"] Itcl ]

但是当我使用

package require Itcl

获取报告:无法加载文件“/somepath/itcl/lib/libitcl-Oa”:/somepath/lib/libitcl-Oa:无效的 ELF 标头

似乎我无法加载带有 .a 扩展名的文件,但以前版本的 tcl (8.4) 也是如此,它工作正常。我搜索了很多,阅读了很多文档,但这并没有帮助更进一步。

请帮忙。

提前致谢

4

1 回答 1

0

库有两种一般类型,静态库和共享库。在 Linux 上,静态库.a默认具有扩展名,共享库具有扩展名.so(可选地加上一些数字来指示版本)。只有共享库才能使用 Tcl 的load命令,即便如此,它们也必须设计为以这种方式工作(具有适当的Foobar_Init功能,如文档所述)。

在处理存根导出扩展(相当少见)或 Tcl 和 Tk 本身时,链接分两部分完成。有一个存根库,通常称为somethingstub.a,还有一个主共享库。主共享库包含代码的实现;存根库中的所有内容都是一个 ABI/API 适配器,因此您可以避免将代码绑定到实现库的显式版本。通过构建一个支持存根的扩展并链接存根库,您可以将您的扩展加载到 Tcl/Tk 的未来版本中,而无需任何重新编译或重新链接步骤。(您还可以将扩展放在一个 Starkit 中进行部署,因为它们使用一种相当不寻常的方式来管理存根机制对您隐藏的共享库。)

于 2013-08-08T08:56:43.777 回答