Загрузка расширения 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, но очень неприятным и НЕ ДЕЛАЕТ ЭТОГО!)