2010-10-26 31 views
0

J'essaye de créer un interpréteur TCL personnalisé avec TclPro selon les instructions au TclPro User's Guide Chapitre 7, mais il échoue avec l'erreur de liaison undefined reference to __ctype_b.Impossible de créer un interpréteur TCL personnalisé avec TclPro1.4: référence non définie à `__ctype_b '

J'ai téléchargé et installé TclPro 1.4 à /opt/ajuba/TclPro1.4/, et est l'interprète personnalisé ici, je veux construire:

// file simple.cpp 
#include <proWrap.h> 
int main(int argc, char** argv) 
{ 
    Pro_WrapTclMain(argc, argv, &Tcl_Init); 
    return 0; 
} 

Il ne fait rien, mais appelle à la norme Pro_WrapTclMainTcl_Init.

Je suis en train de construire simple.cpp avec cette commande:

g++ -DNDEBUG -O3 -fpic -Wall -pedantic -I/opt/ajuba/TclPro1.4/include simple.cpp -static -Wl,-R/opt/ajuba/TclPro1.4/linux-ix86/lib -L/opt/ajuba/TclPro1.4/linux-ix86/lib -lwrapper1.4 -ltcl8.3 -o out 

et est ici le premier message d'erreur que je reçois (vous pouvez trouver le journal complet en bas):

/opt/ajuba/TclPro1.4/linux-ix86/lib/libwrapper1.4.a(envargs.o): In function `envargs': 
envargs.c:(.text+0x1e): undefined reference to `__ctype_b' 

Semble __ctype_b est un symbole que TclPro s'attend à définir à libc.a, mais

nm /usr/lib/libc.a | grep __ctype_b 

donne

00000080 T __ctype_b_loc 

donc il n'y a pas __ctype_b défini à libc.a.

La question est: comment créer un interpréteur TCL personnalisé avec TclPro dans cette situation?

Si __ctype_b doit être défini à libc.a, alors comment puis-je obtenir un libc.a approprié?

Voici le journal complet de la compilation:

g++ -DNDEBUG -O3 -fpic -Wall -pedantic -I/opt/ajuba/TclPro1.4/include simple.cpp -static -Wl,-R/opt/ajuba/TclPro1.4/linux-ix86/lib -L/opt/ajuba/TclPro1.4/linux-ix86/lib -lwrapper1.4 -ltcl8.3 -o out 
/opt/ajuba/TclPro1.4/linux-ix86/lib/libtcl8.3.a(tclUnixPipe.o): In function `TclpCreateTempFile': 
tclUnixPipe.c:(.text+0xe0): warning: the use of `tmpnam' is dangerous, better use `mkstemp' 
/opt/ajuba/TclPro1.4/linux-ix86/lib/libtcl8.3.a(tclUnixFCmd.o): In function `GetGroupAttribute': 
tclUnixFCmd.c:(.text+0xb5b): warning: Using 'getgrgid' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking 
/opt/ajuba/TclPro1.4/linux-ix86/lib/libtcl8.3.a(tclUnixFCmd.o): In function `SetGroupAttribute': 
tclUnixFCmd.c:(.text+0xd59): warning: Using 'getgrnam' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking 
/opt/ajuba/TclPro1.4/linux-ix86/lib/libtcl8.3.a(tclUnixFCmd.o): In function `GetGroupAttribute': 
tclUnixFCmd.c:(.text+0xba1): warning: Using 'endgrent' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking 
/opt/ajuba/TclPro1.4/linux-ix86/lib/libtcl8.3.a(tclUnixFCmd.o): In function `SetOwnerAttribute': 
tclUnixFCmd.c:(.text+0xe7d): warning: Using 'getpwnam' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking 
/opt/ajuba/TclPro1.4/linux-ix86/lib/libtcl8.3.a(tclUnixFCmd.o): In function `GetOwnerAttribute': 
tclUnixFCmd.c:(.text+0xc14): warning: Using 'getpwuid' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking 
tclUnixFCmd.c:(.text+0xc5e): warning: Using 'endpwent' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking 
/opt/ajuba/TclPro1.4/linux-ix86/lib/libtcl8.3.a(tclUnixChan.o): In function `TcpGetOptionProc': 
tclUnixChan.c:(.text+0x8de): warning: Using 'gethostbyaddr' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking 
/opt/ajuba/TclPro1.4/linux-ix86/lib/libtcl8.3.a(tclUnixChan.o): In function `CreateSocketAddress': 
tclUnixChan.c:(.text+0xe4c): warning: Using 'gethostbyname' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking 
/opt/ajuba/TclPro1.4/linux-ix86/lib/libtcl8.3.a(tclIOSock.o): In function `TclSockGetPort': 
tclIOSock.c:(.text+0x47): warning: Using 'getservbyname' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking 
/opt/ajuba/TclPro1.4/linux-ix86/lib/libwrapper1.4.a(envargs.o): In function `envargs': 
envargs.c:(.text+0x1e): undefined reference to `__ctype_b' 
envargs.c:(.text+0x5d): undefined reference to `__ctype_b' 
envargs.c:(.text+0x193): undefined reference to `__ctype_b' 
envargs.c:(.text+0x1c0): undefined reference to `__ctype_b' 
/opt/ajuba/TclPro1.4/linux-ix86/lib/libwrapper1.4.a(envargs.o): In function `count_args': 
envargs.c:(.text+0x23d): undefined reference to `__ctype_b' 
/opt/ajuba/TclPro1.4/linux-ix86/lib/libwrapper1.4.a(envargs.o):envargs.c:(.text+0x29b): more undefined references to `__ctype_b' follow 
/opt/ajuba/TclPro1.4/linux-ix86/lib/libwrapper1.4.a(fileio.o): In function `UzpMorePause': 
fileio.c:(.text+0x9a8): undefined reference to `__ctype_tolower' 
/opt/ajuba/TclPro1.4/linux-ix86/lib/libwrapper1.4.a(fileio.o): In function `do_string': 
fileio.c:(.text+0xf31): undefined reference to `__ctype_b' 
fileio.c:(.text+0xf4a): undefined reference to `__ctype_tolower' 
/opt/ajuba/TclPro1.4/linux-ix86/lib/libwrapper1.4.a(fileio.o): In function `zstrnicmp': 
fileio.c:(.text+0x120c): undefined reference to `__ctype_b' 
fileio.c:(.text+0x1215): undefined reference to `__ctype_tolower' 
/opt/ajuba/TclPro1.4/linux-ix86/lib/libwrapper1.4.a(match.o): In function `recmatch': 
match.c:(.text+0x127): undefined reference to `__ctype_tolower' 
match.c:(.text+0x15f): undefined reference to `__ctype_b' 
match.c:(.text+0x1ad): undefined reference to `__ctype_b' 
match.c:(.text+0x24b): undefined reference to `__ctype_b' 
match.c:(.text+0x264): undefined reference to `__ctype_tolower' 
match.c:(.text+0x28d): undefined reference to `__ctype_b' 
match.c:(.text+0x2a6): undefined reference to `__ctype_tolower' 
/opt/ajuba/TclPro1.4/linux-ix86/lib/libwrapper1.4.a(unix.o): In function `mapname': 
unix.c:(.text+0x441): undefined reference to `__ctype_b' 
unix.c:(.text+0x47b): undefined reference to `__ctype_b' 
/opt/ajuba/TclPro1.4/linux-ix86/lib/libtcl8.3.a(tclIOUtil.o): In function `TclGetOpenMode': 
tclIOUtil.c:(.text+0x36): undefined reference to `__ctype_b' 
/opt/ajuba/TclPro1.4/linux-ix86/lib/libtcl8.3.a(tclListObj.o): In function `SetListFromAny': 
tclListObj.c:(.text+0x7e6): undefined reference to `__ctype_b' 
/opt/ajuba/TclPro1.4/linux-ix86/lib/libtcl8.3.a(tclLoad.o): In function `Tcl_LoadObjCmd': 
tclLoad.c:(.text+0x3cc): undefined reference to `__ctype_b' 
/opt/ajuba/TclPro1.4/linux-ix86/lib/libtcl8.3.a(tclObj.o):tclObj.c:(.text+0x7e8): more undefined references to `__ctype_b' follow 
/opt/ajuba/TclPro1.4/linux-ix86/lib/libtcl8.3.a(tclLoadDl.o): In function `TclpLoadFile': 
tclLoadDl.c:(.text+0x35): undefined reference to `dlopen' 
tclLoadDl.c:(.text+0x5a): undefined reference to `dlerror' 
tclLoadDl.c:(.text+0xa1): undefined reference to `dlsym' 
tclLoadDl.c:(.text+0xe0): undefined reference to `dlsym' 
tclLoadDl.c:(.text+0x119): undefined reference to `dlsym' 
tclLoadDl.c:(.text+0x158): undefined reference to `dlsym' 
/opt/ajuba/TclPro1.4/linux-ix86/lib/libtcl8.3.a(tclLoadDl.o): In function `TclpUnloadFile': 
tclLoadDl.c:(.text+0x19c): undefined reference to `dlclose' 
/opt/ajuba/TclPro1.4/linux-ix86/lib/libtcl8.3.a(tclBinary.o): In function `Tcl_BinaryObjCmd': 
tclBinary.c:(.text+0xbe4): undefined reference to `__ctype_b' 
tclBinary.c:(.text+0xc5d): undefined reference to `__ctype_b' 
/opt/ajuba/TclPro1.4/linux-ix86/lib/libtcl8.3.a(tclBinary.o): In function `GetFormatSpec': 
tclBinary.c:(.text+0x1617): undefined reference to `__ctype_b' 
/opt/ajuba/TclPro1.4/linux-ix86/lib/libtcl8.3.a(tclCmdAH.o): In function `Tcl_CaseObjCmd': 
tclCmdAH.c:(.text+0x185): undefined reference to `__ctype_b' 
/opt/ajuba/TclPro1.4/linux-ix86/lib/libtcl8.3.a(tclCmdAH.o): In function `Tcl_FormatObjCmd': 
tclCmdAH.c:(.text+0x22f5): undefined reference to `__ctype_b' 
/opt/ajuba/TclPro1.4/linux-ix86/lib/libtcl8.3.a(tclCmdAH.o):tclCmdAH.c:(.text+0x23f8): more undefined references to `__ctype_b' follow 
collect2: ld returned 1 exit status 
make: *** [out] Error 1 

Répondre

0

Je ne suis pas sûr de ce que les détails de votre plate-forme sont, mais this message semblerait tenir la réponse. Essentiellement, vous ajoutez ce code à simple.cpp et recompiler:

#include <ctype.h> 

extern "C" { 
__const unsigned short int **__wrap___ctype_b (void) { 
    return __ctype_b_loc(); 
} 
} 

Vous devez également apparemment cette option à la ligne de liaison: -Wl,--wrap,__ctype_b

Hope this helps ...

+0

Merci pour votre réponse. J'ai corrigé les problèmes avec 'référence non définie à __ctype_b' et' référence indéfinie à __ctype_tolower' comme vous l'avez suggéré, cependant, le problème avec 'non défini référence à dlopen' reste toujours (voir le journal g ++). Je compile avec '-ldl' pour basser le libdl.a à l'éditeur de liens, mais il ne reconnaît toujours pas' dlopen', 'dlerror', etc. Peut-être que vous pouvez aussi suggérer un moyen de résoudre ce problème? Merci d'avance. – Vahagn

+0

IIRC (et je ne construis pas normalement statique, donc mon conseil pourrait être un peu ici) il n'est généralement pas recommandé de lier statiquement libc et (surtout) libdl. Utilisez la liaison dynamique pour ces bibliothèques système de base. J'ai oublié les détails cependant; Comme je l'ai dit, je ne construis pas statiquement ces temps-ci (et tclpro a la réputation d'être une mauvaise construction, comme vous le savez). –