Tcl-C - не требует определенного пакета при запуске Tcl Interperter из C - PullRequest
0 голосов
/ 18 ноября 2018

Я хочу расширить свое приложение C / C ++ с помощью Tcl. Я написал следующий код, который должен создать Tcl Interpreter, но я хочу, чтобы он загружал пользовательский пакет, расположенный в ./user/tcl8.6.6/lib.

Проблема в том, что моя программа существует без загрузки чего-либо. Поэтому после отладки программы я увидел, что в интерпретаторе после запуска строки, которая должна требовать моего пакета, будет результат: *myinterp = {result = 0x647d58 "can't find package user", freeProc = 0x0, errorLine = 1}

Я предполагаю, что Tcl Interperter, который вызывается этой строкой, находится где-то, у кого нет этого пакета в подпапке lib.

Итак, мой вопрос: как я могу узнать, каков путь к вызываемой оболочке (может быть, это что-то, связанное с TCL_LIBRARY или другими переменными среды?) И как я могу обновить его или добавить в него местоположение в папке содержит мой пользовательский пакет из моего кода C ??

Это код, который я написал:

int main() {
    Tcl_Interp *myinterp;
    int status;

    printf ("Your Program will run ... \n");
    myinterp = Tcl_CreateInterp();

    std::string test = "package require user";
    status = Tcl_Eval(myinterp,test.c_str());

    std::string test = "set a 5";
    status = Tcl_Eval(myinterp,test.c_str());

    printf ("Your Program has completed\n");
    return 0;
 }

1 Ответ

0 голосов
/ 18 ноября 2018

Tcl инициализирует, откуда загружать пакеты, из переменной среды TCLLIBPATH, которая, если она определена, должна содержать список каталогов Tcl для поиска файлов pkgIndex.tcl (которые определяют, как загружать реализации пакетов). Однако в вашем приложении, если вы знаете, где находится пакет библиотеки, вам следует вместо этого добавить это местоположение в список в глобальной переменной auto_path:

std::string libLocation = "/some/directory/I/know";
Tcl_SetVar(interp, "auto_path", libLocation.c_str(),
        TCL_GLOBAL_ONLY | TCL_APPEND_VALUE | TCL_LIST_ELEMENT);

Сделайте это после создания интерпретатора, но до оценки вашего сценария.


Не устанавливайте TCL_LIBRARY, если вы можете избежать этого. Он определяет, откуда Tcl получает свои внутренние библиотечные сценарии. Я полагаю, вам может потребоваться установить его, если вы встраиваете Tcl и не устанавливаете его отдельно, но это не место, где можно найти не встроенные пакеты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...