【问题标题】:Tcl version change issue from 8.4 to 8.5.12从 8.4 到 8.5.12 的 Tcl 版本更改问题
【发布时间】:2013-08-07 10:46:30
【问题描述】:

在 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-O.a”:/somepath/lib/libitcl-O.a:无效的 ELF 标头

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

请帮忙。

提前致谢

【问题讨论】:

  • 检查readelf -h <libname>并将其与您机器的架构进行比较
  • 我按照您的建议进行了检查。我看不出有什么奇怪的地方
  • 它是否与您的新(8.5.12)tclsh 的 elf 标头匹配?
  • ELF Header 的 Magic、Class、Data、Version、OS/ABI、ABI 版本、Machine、Version、Flags、Size of header、Size of section header 匹配。有几个不匹配的组件,但我认为它们应该是特定于库的。

标签: tcl tclsh


【解决方案1】:

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

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

【讨论】:

  • 尝试使用存根,结果相同% package require Itcl couldn't load file "/test_tcl/tcl8.5.12/unix/install/lib/../lib/libitclstub3.4.a": /test_tcl/tcl8.5.12/unix/install/lib/../lib/libitclstub3.4.a: invalid ELF header pkgIndex.tcl 遵循package ifneeded Itcl 3.4 [list load [file join $dir "libitclstub3.4.a"] Itcl]
猜你喜欢
  • 2011-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-19
  • 2011-01-15
相关资源
最近更新 更多