2010-10-26 2 views
0

Я пытаюсь создать собственный интерпретатор TCL с инструкциями TclPro в соответствии с инструкциями в разделе TclPro User's Guide. Глава 7, но с ошибкой связывания undefined reference to __ctype_b.Не удалось создать настраиваемый интерпретатор TCL с TclPro1.4: неопределенная ссылка на `__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 является символом, который TclPro рассчитывает определить в libc.a, но

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

дает

00000080 T __ctype_b_loc 

так нет __ctype_b определена в libc.a.

Вопрос в следующем: как построить собственный TCL-интерпретатор с TclPro в этой ситуации?

Если __ctype_b должно быть определено в libc.a, то как я могу получить подходящий 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 

ответ

0

Я не знаю точно, что детали вашей платформы, но 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

Надеются, что это помогает ...

+0

Спасибо за ваш ответ. Я исправил проблемы с «неопределенной ссылкой на __ctype_b» и «неопределенной ссылкой на __ctype_tolower» в том виде, в котором вы предлагали, как бы проблема с неопределенной ссылкой на dlopen не осталась (см. Журнал g ++). Я компилирую с '-ldl' для баса libdl.a в компоновщик, но он все еще не распознает' dlopen', 'dlerror' и т. Д. Может быть, вы также можете предложить способ решения этой проблемы? Заранее спасибо. – Vahagn

+0

IIRC (и я обычно не статирую статику, поэтому мой совет может быть немного отсюда) обычно не рекомендуется статически связывать libc и (особенно) libdl. Используйте динамические ссылки для этих базовых системных библиотек. Однако я забываю детали; как я уже сказал, я не статично статично в эти дни (и tclpro имеет репутацию неудачной сборки, как вы узнаете). –