代码之家  ›  专栏  ›  技术社区  ›  Vahagn

无法使用TclPro1.4创建自定义TCL解释器:未定义对“ctype”的引用

  •  0
  • Vahagn  · 技术社区  · 14 年前

    我正试图根据 TclPro User's Guide 第七章,但是它失败了,链接错误 undefined reference to __ctype_b .

    我已经下载并安装了TclPro 1.4 /opt/ajuba/TclPro1.4/ ,这是我要构建的自定义解释器:

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

    所以它只会打电话 Pro_WrapTclMain 有标准的 Tcl_Init

    我在努力建立 simple.cpp

    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/libwrapper1.4.a(envargs.o): In function `envargs':
    envargs.c:(.text+0x1e): undefined reference to `__ctype_b'
    

    似乎 __ctype_b

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

    给予

    00000080 T __ctype_b_loc
    

    所以在libc.a中没有定义ctype。

    如果 __C类型 应该定义在 libc.a ,那么我怎样才能得到一个合适的 ?

    以下是编译的完整日志:

    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
    
    1 回复  |  直到 14 年前
        1
  •  0
  •   Donal Fellows    14 年前

    我不知道你们平台的细节是什么,但是 this message 似乎能找到答案。实际上,您可以将此代码添加到 simple.cpp 重新编译:

    #include <ctype.h>
    
    extern "C" {
    __const unsigned short int **__wrap___ctype_b (void) {
      return __ctype_b_loc();
    }
    }
    

    显然,您还需要将此选项链接到链接行: -Wl,--wrap,__ctype_b

    希望这有帮助。。。