Re: Need help with loading .SO file




Tobias Hippler wrote:
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

Thanks, Tobi.

You are right.
But my main problem is compiling this the static TCL library.
If I'm trying to copile like this: gcc -fPIC -c Proc.cpp
the tcl loader screaming about unresolved simbles; as far as I
understand it happens because I did not compile my prog with out
libtk8.3.a.
How do I suppose to do it?
I think it somthing like: gcc -fPIC -l libtk8.3.a -c Proc.cpp
But it doesn't work...

.



Relevant Pages

  • Re: Need help with loading .SO file
    ... int GetText(ClientData clientData, ... int Proc_Init(Tcl_Interp *interp) ... int GetText(ClientData clientData, Tcl_Interp *interp, int argc, char ... 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) ... int GetText(ClientData clientData, Tcl_Interp *interp, int argc, char ... 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, ... 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)