Impossibile creare un interprete TCL personalizzato con tclPro1.4: riferimento indefinito a `__ctype_b '

StackOverflow https://stackoverflow.com/questions/4022721

  •  26-09-2019
  •  | 
  •  

Domanda

Sto cercando di creare un interprete TCL personalizzato con TCLPRO secondo le istruzioni a Guida dell'utente TCLPRO Capitolo 7, ma fallisce con il collegamento di un errore undefined reference to __ctype_b.

Ho scaricato e installato TCLPRO 1.4 a /opt/ajuba/TclPro1.4/, ed ecco l'interprete personalizzato che voglio costruire:

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

Quindi non fa altro che chiamate Pro_WrapTclMain con standard Tcl_Init.

Sto cercando di costruire simple.cpp Con questo comando:

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

Ed ecco il primo messaggio di errore che ricevo (puoi trovare il registro completo in fondo):

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

Sembra __ctype_b è un simbolo che TclPro prevede di essere definito a libc.a, ma

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

00000080 T __ctype_b_loc

Quindi non esiste __ctype_b definito a libc.a.

La domanda è: come costruire un interprete TCL personalizzato con TCLPRO in questa situazione?

Se __ctype_b dovrebbe essere definito a libc.a, allora come posso ottenere un appropriato libc.a?

Ecco il registro completo della compilazione:

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
È stato utile?

Soluzione

Non so con certezza quali siano i dettagli della tua piattaforma, ma questo messaggio sembrerebbe trattenere la risposta. In sostanza, aggiungi questo codice a simple.cpp e ricompila:

#include <ctype.h>

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

Apparentemente hai anche bisogno di questa opzione sulla linea di collegamento: -Wl,--wrap,__ctype_b

Spero che sia di aiuto...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top