RE:ROOT Enhancement Request

From: Masaharu Goto (MXJ02154@niftyserve.or.jp)
Date: Thu Jun 04 1998 - 14:42:00 MEST


** Electronic Enhancement Request Form **
Zvyagin,

The error is produced by the linker not CINT or ROOT. It is impossible to
prevent this because this is compiler/linker dependent. 

The problem happens in following way.

 1) You have 'extern' symbol in header file but don't have body of it in 
   source file.  Usually this is fine. 
 2) makecint or rootcint parses the 'extern' declaration and generates STUB
   access routine in dictionary. There the 'extern' symbol is referenced so
   its' body must exist. 
 3) If you compile your stuff with the dictionary, missing routine is left
   unresolved. But shared library can be created.
 4) When you load the shared library, linker searches for the missing symbol
   because it is referenced from the dictionary. But there is no body. This
   causes the linker to generate an error.

There is no way preventing this automatically. 

There are only 2 ways to workaround this problem.

 1) Eliminate 'extern' declaration which has no body. Or enclose it by 
   #ifndef __MAKECINT__ as follows

     #ifndef __MAKECINT__
     extern void no_body_symbol();
     #endif

 2) If you do not like to modify header file, use '#pragma link' statement 
   to turn off dictionary generation.

     #pragma link off function   no_body_function;
     #pragma link off global     no_body_globalvariable;

   I recommend to setup LinkDef.h file containing '#pragma link' statements
   and give it at the end of header file chain.

     makecint -mk Makefile -dl my.dll -H a.h b.h LinkDef.h -C++ ...

Masaharu Goto

--------------------------------
Name:           Zvyagin Alexander
E-mail address: zvyagin@mx.ihep.su

Enhancement urgency: normal

ENHANCEMENT DESCRIPTION:
I have shared library with unresolved symbol.
(This symbol is described 'extern' in the C++ code.)

CINT fails to load the library with next diagnostic:
root [0] .L Mylib.so
/usr/local/root/bin/root.exe: can't resolve symbol 'symbol_name'
....

It'll be nice to produce warning, not error message(s) and
load into CINT libraries with unresolved symbol(s).

Operation System: Linux 2.0.32,
ROOT 2.00/07



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