我在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)也是如此,它运行正常。我google了很多,阅读了很多文档,但它没有进一步的帮助。
请帮忙。
提前致谢
答案 0 :(得分:0)
库有两种常规类型,静态库和共享库。在Linux上,默认情况下,静态库的扩展名为.a
,共享库的扩展名为.so
(可选择一些数字来表示版本)。 只有共享库才能使用Tcl的load
命令 ,即使这样,它们也必须按照这种方式工作(使用适当的Foobar_Init
函数,如记录所示。)
当处理存根导出扩展(相当罕见)或Tcl和Tk本身时,链接分两部分完成。有一个存根库,通常称为somethingstub.a
,并且有一个主共享库。主共享库包含代码的实现;存根库中的所有内容都是ABI / API适配器,因此您可以避免将代码绑定到实现库的显式版本。通过构建扩展存根启用并链接存根库,您可以将扩展加载到Tcl / Tk的未来版本中,而无需任何重新编译或重新链接步骤。 (您也可以将扩展放在starkit中进行部署,因为那些扩展机制使用了一种管理共享库的非常不寻常的方式。)