Tcl版本从8.4更改为8.5.12

Tcl版本从8.4更改为8.5.12,tcl,tclsh,Tcl,Tclsh,我在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 获取报告:无法加

我在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中也是如此,并且工作正常。我在谷歌上搜索了很多,阅读了很多文档,但这无助于进一步研究

请帮忙


提前感谢

库有两种,静态库和共享库。在Linux上,默认情况下,静态库具有扩展名.a,共享库具有扩展名。因此,可以选择添加一些数字来指示版本。只有共享库才能与Tcl的load命令一起工作,即使如此,它们也必须设计成与适当的Foobar_Init函数一起工作,如文档所示


在处理非常罕见的存根导出扩展或Tcl和Tk本身时,链接分为两部分。有一个存根库,通常称为somethingstub.a,还有一个主共享库。主共享库包含代码的实现;存根库中只有一个ABI/API适配器,这样您就可以避免将代码绑定到实现库的显式版本。通过启用扩展存根并链接存根库,您可以将扩展加载到未来版本的Tcl/Tk中,而无需任何重新编译或重新链接步骤。您还可以将扩展放在starkit中进行部署,因为它们使用了一种非常不寻常的方式来管理存根机制对您隐藏的共享库。

检查readelf-h,并将其与您机器的体系结构进行比较。我没有发现任何奇怪的地方,它是否与新的8.5.12 tclsh的elf头匹配?elf头的魔力、类、数据、版本、OS/ABI、ABI版本、机器、版本、标志、头的大小、节头的大小都匹配。有几个不匹配的组件,但我认为它们应该是特定于库的,结果是相同的%package require Itcl无法加载文件/test_tcl/tcl8.5.12/unix/install/lib/。/lib/libitclstub3.4.a:/test_tcl/tcl8.5.12/unix/install/lib/。/libitclstub3.4.a:无效的ELF头pkgIndex.tcl是下面的包,如果需要itcl3.4[列表加载[文件加入$dir libitclstub3.4.a]