Проблема изменения версии Tcl с 8.4 на 8.5.12

У меня проблема с изменением версии tcl с 8.4 на 8.5.12 на машине RHEL. Наш продукт использует компоненты TclDevKit, такие как Tcldom, Tclxml и т. д. Также мы используем Incr Tcl (Itcl). Я пытаюсь создать файл pkgIndex.tcl в Itcl, чтобы найти 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) и работает нормально. Я много гуглил, читал много документации, но это не помогает идти дальше.

Пожалуйста помоги.

заранее спасибо


person danny    schedule 07.08.2013    source источник
comment
Отметьте readelf -h <libname> и сравните с архитектурой вашей машины.   -  person Varun    schedule 07.08.2013
comment
Я проверил, как вы предложили. ничего странного в этом не вижу   -  person danny    schedule 07.08.2013
comment
Соответствует ли он эльфийскому заголовку вашего нового (8.5.12) tclsh?   -  person Varun    schedule 07.08.2013
comment
Магия заголовка ELF, класс, данные, версия, ОС/ABI, версия ABI, машина, версия, флаги, размер заголовка, размер заголовка раздела совпадают. Есть несколько непревзойденных компонентов, но я думаю, что они должны быть специфичными для библиотеки.   -  person danny    schedule 07.08.2013


Ответы (1)


Библиотеки бывают двух основных типов: статические библиотеки и разделяемые библиотеки. В Linux статические библиотеки по умолчанию имеют расширение .a, а общие библиотеки имеют расширение .so (плюс, при необходимости, некоторые числа для обозначения версии). Только разделяемые библиотеки будут работать с командой Tcl load, и даже в этом случае они должны быть спроектированы таким образом (с соответствующей функцией Foobar_Init, как описано в документации).

При работе с расширениями, экспортирующими заглушки (довольно редко) или самими Tcl и Tk, связывание выполняется в две части. Есть библиотека-заглушка, обычно называемая somethingstub.a, и основная общая библиотека. Основная разделяемая библиотека содержит реализацию кода; все, что находится в библиотеке-заглушке, — это адаптер ABI/API, так что вы можете избежать привязки своего кода к явной версии библиотеки реализации. Создав расширение с поддержкой заглушек и связав его с библиотекой заглушек, вы получаете возможность загрузить ваше расширение в будущие версии Tcl/Tk вообще без каких-либо шагов перекомпиляции или перекомпоновки. (Вы также можете поместить расширение в комплект для развертывания, так как они используют довольно необычный способ управления разделяемыми библиотеками, который механизм заглушки скрывает от вас.)

person Donal Fellows    schedule 08.08.2013
comment
Пробовал с заглушкой, результат тот же % 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] - person danny; 21.08.2013