Загрузка расширения tcl из tclsh

У меня есть расширение C для Tcl, где определяется команда mytest. Расширение правильно скомпилировано (у меня Linux, расширение *.so). Например, я могу запустить tclsh и использовать его так:

$ tclsh
% load /path/extension.so
% mytest abc
...

Но, если я создам файл myscript.tcl со следующим содержанием:

load /path/extension.so
mytest abc

тогда я получаю ошибку:

$ tclsh myscript.tcl 
invalid command name "mytest"
    while executing
"mytest abc"
    (file "myscript.tcl" line 2)

Я использую Bash на Ubuntu 14.04. Tcl 8.6.

РЕДАКТИРОВАТЬ 1: Мой вопрос / проблема в том, что я хочу использовать tclsh со сценарием в качестве аргумента - этот сценарий должен правильно загружать расширения таким образом, чтобы mytest и другие реализованные функции работали без ошибок.

РЕДАКТИРОВАТЬ 2: Ухх, если я использую команду "source myscript.tcl" внутри оболочки tcl, результат будет тот же. Если я использую абсолютный путь для myscript.tcl, ошибка все та же - "загрузка" выполняется без предупреждения, но я не уверен в этом, потому что я получаю неверное имя команды "mytest". Возможно, проблема в области видимости, но она работает правильно, когда tclsh используется в интерактивном режиме.

1 ответ

Решение

Если вы используете полный путь библиотеки расширений в обоих случаях, эта часть должна работать одинаково. Это, вероятно, делает, хотя; если он не может загрузить его, он выдаст ошибку (которая может или не может быть полезной, так как некоторые из способов, которые терпят неудачу, дают очень мало информации; Tcl сообщает, что у него есть, но иногда этого недостаточно, так как зависит от ОС, чтобы сказать ему некоторые вещи). Вместо этого проблема, вероятно, в другом месте.

Основное различие между интерактивным использованием и использованием сценариев заключается в том, что при интерактивном использовании unknown Команда расширит неизвестные имена команд до команд Tcl, для которых введенная вами вещь является однозначным префиксом. Это удобно, но при преобразовании в сценарий вы всегда должны использовать полное имя команды. ОК, не полное полное имя команды - вы в основном не хотите или не нуждаетесь в :: пространство имен на передней панели - но без аббревиатуры, поэтому не используйте lappe за lappend, (При интерактивном использовании Tcl также exec вещи как внешние программы, не требуя ввода exec явно; опять же, это отключено в сценариях, так как оно довольно хрупкое.)

Может быть, это то, что происходит? Вы можете проверить, установив глобальную переменную tcl_interactive в 0 перед вводом кода (я рекомендую использовать для этой типизации команду cut-n-paste, чтобы вы точно знали , что происходит). Если это не сработает, это поможет вам в интерактивном режиме. Проверьте, какие команды вы можете использовать в качестве расширения для префикса с info commands (после load, конечно):

info commands mytest*

Если это просто сообщает mytest Моя теория неверна. (Ну, если это так, а длина этой строки равна 6; теоретически, в имени команды могут быть добавлены дополнительные невидимые символы, что будет допустимым Tcl, но очень неприятным и НЕ ДЕЛАЕТ ЭТОГО!)

Другие вопросы по тегам