Re: Need help with loading .SO file



ShurikAg@xxxxxxxxx wrote:
There is Proc.cpp:
#include "tcl.h"

//#pragma comment(lib,"C:/TCL/lib/tcl84.lib")

int GetText(ClientData clientData,
Tcl_Interp *interp,
int argc, char *argv[]);

int Proc_Init(Tcl_Interp *interp)
{
if (Tcl_InitStubs(interp, "8.3", 0) == NULL) {
return TCL_ERROR;
}

Tcl_CreateCommand(interp, "gettext", GetText,
(ClientData)NULL, (Tcl_CmdDeleteProc *)NULL);

Tcl_PkgProvide(interp, "gettext", "1.1");


return TCL_OK;
}

int GetText(ClientData clientData, Tcl_Interp *interp, int argc, char
*argv[])
{

sprintf(interp->result, "%d", 25);
return TCL_OK;
}


Compiling: gcc -fPIC -c Proc.cpp
Linking: gcc -shared -o Proc.so Proc.o

Entering to TCL: wish8.3

Trying to load the Library: % load
/nfs/iil/disks/home05/aagulya/TCL/Proc.so

... and getting the error: couldn't find procedure Proc_Init

Where am I wrong????


Hi,

you have to add extern "C" in front of the definition of Proc_Init:

extern "C" int Proc_Init(Tcl_Interp *interp)
{
if (Tcl_InitStubs(interp, "8.3", 0) == NULL) {
return TCL_ERROR;
...
...
}

Otherwise the symbols of your *.so get mangled (c++ - style) and the runtime loader can't find the symbol "Proc_Init".
BTW if you don't have to use C++, you can simply rename your file to "Proc.c". This way the C compiler is used and no name mangling occurrs.

Cheers,
Tobi
.



Relevant Pages

  • Re: C++/TCL Need Solution to Compile Error c2784
    ... Tcl_Interp *interp, ... int DisconnectObjCmd(ClientData clientData, ... Tcl_CreateObjCommand(interp, "Disconnect", DisconnectObjCmd, ...
    (comp.lang.tcl)
  • Re: Segmentation fault in internal Tcl function
    ... static int updateTclVariables ... Tcl_Preserveinterp); ... private clientdata structure and pass them to thread per-value instead of per- ... called by the above updateTclVariables and puts it into the QueueEvent. ...
    (comp.lang.tcl)
  • Re: Need help with loading .SO file
    ... int GetText(ClientData clientData, ... int Proc_Init(Tcl_Interp *interp) ... Tcl_CreateCommand(interp, "gettext", GetText, ... But my main problem is compiling this the static TCL library. ...
    (comp.lang.tcl)
  • Re: Need help with loading .SO file
    ... int GetText(ClientData clientData, ... int Proc_Init(Tcl_Interp *interp) ... Tcl_CreateCommand(interp, "gettext", GetText, ... But my main problem is compiling this the static TCL library. ...
    (comp.lang.tcl)
  • Re: Need help with loading .SO file
    ... int GetText(ClientData clientData, ... int Proc_Init(Tcl_Interp *interp) ... Tcl_CreateCommand(interp, "gettext", GetText, ... reason to stay with Tcl 8.3 you should try to use a recent Tcl like Tcl ...
    (comp.lang.tcl)