C functions in ROOT/CINT...

From: Fons Rademakers (Fons.Rademakers@cern.ch)
Date: Mon Mar 08 1999 - 11:22:53 MET


Also using rootcint it's quite simple to make standard C functions available
to ROOT/CINT.

For example:

- You have header file for C routines:

#ifndef __CINT__
#ifdef __cplusplus
extern "C" {
#endif
#endif

enum ml_status { mlOK, mlFATAL };

extern int ml_init(int);
extern int ml_exit();

#ifndef __CINT__
#ifdef __cplusplus
}
#endif
#endif

- Make LinkDef file:

/*----- file mlLinkDef.h ------*/

#ifdef __CINT__

#pragma link off all globals;
#pragma link off all classes;
#pragma link off all functions;

#pragma link C function ml_init;
#pragma link C function ml_exit;

#pragma link C enum ml_status;

#endif

- generate dictionary:

  $ rootcint -f mlDict.cxx -c ml.h mlLinkDef.h

- Compile C++ dictionary code:

  $ g++ -fPIC -I$ROOTSYS/include -c mlDict.cxx

- Compile C source, ml.c:

  $ gcc -fPIC -c ml.c

- Link into shared library, using the C++ compiler needed to add
  correct init code for the global objects in the dictionary:

  $ g++ -shared -o ml.so ml.o mlDict.o

- Now you have a shared library containing your C code plus the CINT
  dictionary information. To use it do:

$ root
root [0] gSystem.Load("ml")
(int)0
root [1] ml_init(2)
this is ml_init ini=2
(int)0
root [2] ml_exit()
this is ml_exit
root [3] mlFATAL
(enum ml_status)1
root [4] .q


Cheers, Fons.



Masaharu Goto wrote:
> 
> >
> >I would love to be able to load precompiled ANSI C functions without the need
> >to construct my own classes and recompile cint/root. May be this is already
> >possible?
> 
> You can do this already. Unfortunately, rootcint does not support this
> capability, but makecint does. You need to install bare cint, then
> 
>  $ makecint -mk Makefile -dl cprog.dll -h cprog.h -C cprog.c
>  $ make -f Makefile
> 
> Then you will have cprog.dll which contains your ANSI C functions.
> You can load this dll just like other shared libraries.  Please read
> doc/makecint.txt for detail.
> 
> Masaharu Goto

-- 
Org:    CERN, European Laboratory for Particle Physics.
Mail:   1211 Geneve 23, Switzerland
E-Mail: Fons.Rademakers@cern.ch              Phone: +41 22 7679248
WWW:    http://root.cern.ch/~rdm/            Fax:   +41 22 7677910



This archive was generated by hypermail 2b29 : Tue Jan 04 2000 - 00:43:30 MET