Na minha ferramenta tcl eu uso uma biblioteca binária compartilhada na forma de arquivo .so + pkgIndex.tcl, então uso package require
para carregar o pacote real. Funciona perfeitamente bem na minha máquina, mas quando tento empacotá-lo no Starpack, recebo o erro ao tentar carregar esse pacote: couldn't load file "/tmp/tcl_MI8NvK":/tmp/tcl_MI8NvK: undefined symbol: Tcl_AppendResult
O resto do programa em tcl puro funciona bem. Parece que perdi alguma biblioteca importante lá, mas não tenho certeza de qual. Se eu compilar minha biblioteca compartilhada com a inclusão de /usr/lib/x86_64-linux-gnu/libtcl8.6.a, ocorrerá outro erro:
couldn't load file "/tmp/tcl_4cwr95":/tmp/tcl_4cwr95: undefined symbol: inflate
.
Eu uso C simples e SWIG para gerar código wrapper para a biblioteca C. Também executo o SWIG com o sinalizador -DUSE_TCL_STUBS. Agradeço antecipadamente.
PS Tudo inclui no código C:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include "filter.h"
#include <stddef.h>
#include <tcl.h>
#include <errno.h>
#include <stdarg.h>
#include <ctype.h>
Não vejo nada aqui que precise de cuidados extras...
Ao usar
-DTCL_USE_STUBS
para construir sua biblioteca carregável, você também precisa vincular à biblioteca stub Tcl (para vincular a uma ABI específica; a biblioteca stub contém o fichário ABI) e chamarTcl_InitStubs
antes de qualquer outra chamada (para concluir a ligação ABI).Bibliotecas não-Tcl (e não-Tk) em sua maioria não sabem nada sobre o mecanismo stub e, portanto, precisam ser vinculadas estaticamente ou encontradas dinamicamente no ambiente de tempo de execução de destino.