Re: [ROOT] Trouble with user libraries under Mac OSX (Darwin)

From: Stephen Sanders (ssanders@ku.edu)
Date: Fri Sep 06 2002 - 16:56:01 MEST


Hi Rene,
Thanks.  Yes, the classes do have the ClassDef stuff:
-------------------------------
#foo.h:
#ifndef FOO
#define FOO

#ifndef ROOT_TObject
#include "TObject.h"
#endif

class Foo : public TObject
{
public:
   Foo();
   Foo(const Char_t * Name, const Char_t * Title);
   virtual ~Foo();
   ClassDef(Foo,0)
     };

#endif
-----------------------------------------------
#foo.cxx:
#ifndef FOO
#include "foo.h"
#endif
#include <iostream.h>
ClassImp(Foo)

Foo::Foo()
{
   //Default constructor.
}

Foo::Foo(const Char_t *name, const Char_t *title):TObject()
{
   cout<<name<<endl;
}
Foo::~Foo()
{
}
On Friday, September 6, 2002, at 09:43 AM, Rene Brun wrote:

> Hi Stephen,
>
> I assume that all your classes (eg Foo) have a ClassDef in the header
> file.
> I cc your mail to the two Darwin experts Keisuke Fujii and George M. 
> Irwin
>
> Rene Brun
>
> On Fri, 6 Sep 2002, Stephen Sanders wrote:
>
>> Hi Rene,
>> I believe I am doing this step correctly.  Or, at least, what I am 
>> doing
>> works under
>> linux.  For the user class I have
>> --------------------------------------------------
>> rootcint -f foodict.cxx -c -p -O -pipe -fPIC -I/usr/local/include/root
>> -I/usr/X11R6/include -I/usr/X11R6/include/X11 -DDARWIN
>> -I/usr/local/include/brat foo.h fooInclude.h fooLinkDef.h
>>
>> c++ -DPACKAGE=\"foo\" -DVERSION=\"1.0\" -DONL_unix=1 -I. -I. -O -pipe
>> -fPIC -I/usr/local/include/root -I/usr/X11R6/include
>> -I/usr/X11R6/include/X11 -DDARWIN -I/usr/local/include/brat -ldl -c
>> foodict.cxx -Wp,-MD,.deps/foodict.TPlo  -fno-common -DPIC -o foodict.lo
>>
>> c++ -dynamiclib -flat_namespace -undefined suppress -o
>> .libs/libfoo.0.0.0.dylib  foo.lo foodict.lo  -ldl -ldl -lm -lc
>> -install_name  /Users/sanders/lib/foo/libfoo.0.dylib
>> -compatibility_version 1 -current_version 1.0
>> --------------------------------------------------------
>> (I just noticed this was not in the make.log file that I posted.  I had
>> previously created the dictionary file.)
>>
>> Then, for the main TRint derived class:
>>
>> ----------------------------------------------------------------
>> rootcint -f BrRintDict.cxx -c -O -pipe -fPIC -I/usr/local/include/root
>> -I/usr/X11R6/include -I/usr/X11R6/include/X11 -DDARWIN
>> -I/usr/local/include/brat BrRint.h
>>
>> c++ -ldl -o .libs/bratroot -Xlinker -bind_at_load -L/usr/local/lib/root
>> -lCore -lCint -lHist -lGraf -lGraf3d -lGpad -lTree -lRint -lPostscript
>> -lMatrix -lPhysics -lEG -lMySQL -lm -ldl -L/usr/local/lib -lBratDataAbc
>> -lBratDataParams -lBratModuleAbc -lBratModuleUtil -lBratManager
>> -lBratUtil -lBratDb -lBratDb -lBratDataCalib -lBratDataCentrality
>> -lBratDataGeant -lBratDataParams -lBratDataPid -lBratDataRaw
>> -lBratDataRdo -lBratDataTrack -lBratDataVertex -lBratModuleCalib
>> -lBratModuleCent -lBratModuleSimul -lBratModuleVisual -lBratModuleIO
>> -lBratModulePid -lBratModuleRaw -lBratModuleRdo -lBratModuleTrack
>> -lBratModuleVertex -lBratPackages -L/usr/X11R6/lib -lRint -lSM -lICE
>> -lX11 -lXpm BrRintMain.o BrRint.o BrRintDict.o -lRint -L.libs -lfoo 
>> -ldl
>> -ldl -lm
>> ---------------------------------------------------------------
>>
>> Above, the new user library is .libs/libfoo.dylib.  I also have linked
>> in the various BRAT libraries (all created with
>> rootcint), however none of the library classes are available unless I
>> add code like:
>>
>> #include "foo.h"
>> Foo foo;
>>
>> in the main program.
>>
>> Any other suggestions??
>>
>> Regards,
>> Steve
>>
>> On Friday, September 6, 2002, at 08:56 AM, Rene Brun wrote:
>>
>>> Hi Stephen,
>>>
>>> If you want to call your BRAT classes interactively from CINT, your
>>> classes must be known to CINT via the dictionary created with 
>>> rootcint.
>>> Are you running this step?
>>> See examples in Users Guide and in $ROOTSYS/test/Event
>>>
>>> Rene Brun
>>>
>>> On Fri, 6 Sep 2002, Stephen Sanders wrote:
>>>
>>>> Hi Damir,
>>>> I do successfully generate both the .dylib and .so library files.  
>>>> The
>>>> .so files load fine using
>>>> gSystem->Load("xxx") command, and I can successfully link to classes 
>>>> in
>>>> the .dylib libraries.
>>>> My problem (I think--since it doesn't work, I'm clearly missing some
>>>> important step!)
>>>> is somehow related to CINT not recognizing the global symbols in the
>>>> .dylib(??) files.
>>>> I can force things to work OK by creating instances of the user 
>>>> classes
>>>> in the TRint derived
>>>> main program.  Unfortunate, the BRAT system has hundreds of classes 
>>>> and
>>>> so this is clearly not
>>>> a very attractive solution.
>>>>
>>>> Regards,
>>>> Steve
>>>>
>>>> On Friday, September 6, 2002, at 02:18 AM, Damir Buskulic wrote:
>>>>
>>>>> Hi,
>>>>>
>>>>> I had the same kind of problems. Apparently, one needs to generate 
>>>>> TWO
>>>>> libraries for each one that was generated before. One for the 
>>>>> symbols,
>>>>> one for the code.
>>>>>
>>>>> Can someone explain a little better why and how to do it properly ?
>>>>>
>>>>> I'm also still stuck to that kind of problems. ROOT works fine (so 
>>>>> the
>>>>> problem seems solved for it) but my code doesn't work, while it does
>>>>> on
>>>>> all other platforms.
>>>>>
>>>>> Cheers
>>>>>
>>>>> Damir
>>>>>
>>>>> Stephen Sanders wrote:
>>>>>> Hi,
>>>>>> I am attempting to port the BRAT program of the BRAHMS
>>>>>> Collaboration at RHIC to Darwin.  The entire BRAT system  builds
>>>>>> fine,
>>>>>> but I'm
>>>>>> having trouble linking in the brat classes with CINT so that they
>>>>>> are available without doing an explicit gSystem->Load().   Instead,
>>>>>> I get errors of the sort shown below. I have set DYLD_LIBRARY_PATH 
>>>>>> to
>>>>>> include
>>>>>> the location of my shared libraries.  I am also able to  explicitly
>>>>>> load the user classes.
>>>>>> The root classes can be accessed fine.
>>>>>> The code and appropriately modified build instructions do work on
>>>>>> linux systems.
>>>>>> ----------------
>>>>>> brat [0] Foo * foo = new Foo()    <---ON LINUX SYSTEMS THIS WORKS
>>>>>> Error: Symbol Foo is not defined in current scope
>>>>>> FILE:/var/tmp/tmp.2.012580_cint LINE:1
>>>>>> Error: Symbol Foo is not defined in current scope
>>>>>> FILE:/var/tmp/tmp.2.012635_cint LINE:1
>>>>>> Error: type Foo not defined FILE:/var/tmp/tmp.2.012635_cint LINE:1
>>>>>> Warning: Automatic variable Foo* foo allocated in global scope
>>>>>> FILE:/var/tmp/tmp.2.012635_cint LINE:1
>>>>>> Error: Undeclared variable Foo* foo FILE:/var/tmp/tmp.2.012635_cint
>>>>>> LINE:1
>>>>>> *** Interpreter error recovered ***
>>>>>> brat [1] gSystem->Load("foo")    <----THIS WORKS
>>>>>> (int)0
>>>>>> brat [2] Foo * foo = new Foo("a","a")
>>>>>> a
>>>>>> -------------------------
>>>>>> If I start the TRint derived main program in gdb,
>>>>>> I am able to set breakpoints on the user class Foo,
>>>>>> but autocompletion does not return the argument lists:
>>>>>> [kunuc5:~/Documents/foo] sanders% gdb ~/bin/bratroot
>>>>>> This GDB was configured as "powerpc-apple-macos10".
>>>>>> Reading symbols for shared libraries .. done
>>>>>> (gdb) break main
>>>>>> Breakpoint 1 at 0x2854
>>>>>> (gdb) run
>>>>>> Starting program: /Users/sanders/bin/bratroot
>>>>>> [Switching to process 12624 thread 0x1603]
>>>>>> Reading symbols for shared libraries ................... done
>>>>>> Breakpoint 1, 0x00002868 in main ()
>>>>>> (gdb) break Foo::Foo
>>>>>> Breakpoint 2 at 0x10ce228
>>>>>> (gdb)
>>>>>> ---------------------------------------------------------------
>>>>>> To test the system, I've built a simple library libfoo with a 
>>>>>> single
>>>>>> class Foo. This
>>>>>> is linked to a TRint derived class BrRint as shown below: (I've
>>>>>> supplied links to the
>>>>>> actual programs.) Again, I've moved this to a linux system, 
>>>>>> commented
>>>>>> out the MODULE
>>>>>> stuff, and everything works as it should.
>>>>>> ----------------------------------------------------------------
>>>>>> AM_CPPFLAGS = -O -pipe -fPIC -I/usr/local/include/root
>>>>>> -I/usr/X11R6/include -I/usr/X11R6/include/X11
>>>>>> ROOTLIBS=-L/usr/local/lib/root -lCore -lCint -lHist -lGraf -lGraf3d
>>>>>> -lGpad -lTree -lRint -lPostscript -lMatrix -lPhysics -lm -ldl
>>>>>> XLIBS= -L/usr/X11R6/lib -lRint -lSM -lICE -lX11 -lXpm
>>>>>> LIBNAME =libfoo.la
>>>>>> MODULE  =foo.la
>>>>>> pkglib_LTLIBRARIES = $(LIBNAME) $(MODULE)
>>>>>> pkginclude_HEADERS = "http://www.phsx.ukans.edu/~sanders/foo/foo.h"
>>>>>> libfoo_la_SOURCES = 
>>>>>> "http://www.phsx.ukans.edu/~sanders/foo/foo.cxx"
>>>>>> foodict.cxx
>>>>>> libfoo_la_LDFLAGS = -ldl -lm  -R$(HOME)/Documents/foo/.libs
>>>>>> foo_la_SOURCES = $(libfoo_la_SOURCES)
>>>>>> foo_la_LDFLAGS = -module -Xlinker -bind_at_load $(ROOTLIBS)
>>>>>> -R$(HOME)/Documents/foo/.libs
>>>>>> bin_PROGRAMS        = bratroot
>>>>>> bratroot_LDADD        = -lRint libfoo.la
>>>>>> bratroot_LDFLAGS    = -Xlinker -bind_at_load $(ROOTLIBS) $(XLIBS)
>>>>>> bratroot_SOURCES    =
>>>>>> "http://www.phsx.ukans.edu/~sanders/foo/BrRintMain.cxx"          \
>>>>>>               "http://www.phsx.ukans.edu/~sanders/foo/BrRint.cxx"
>>>>>> "http://www.phsx.ukans.edu/~sanders/foo/BrRint.h"       \
>>>>>>               BrRintDict.h BrRintDict.cxx
>>>>>> CLEANFILES = *Dict.*
>>>>>> %dict.cxx %dict.h:%.h
>>>>>>     rootcint -f $*dict.cxx -c -p $(AM_CPPFLAGS) $< $*Include.h
>>>>>> $*LinkDef.h
>>>>>> %Dict.cxx %Dict.h:%.h
>>>>>>     rootcint -f $*Dict.cxx -c $(AM_CPPFLAGS) $<
>>>>>> -----------------------------------------------------------------------------------------------------------------------------------
>>>>>> The resulting  Makefile is:
>>>>>> "http://www.phsx.ukans.edu/~sanders/foo/Makefile"
>>>>>> The log of the make operation is at :
>>>>>> "http://www.phsx.ukans.edu/~sanders/foo/make.log"
>>>>>> Any suggestions?  Has anyone been successful getting someting like
>>>>>> this to work
>>>>>> under Darwin?
>>>>>> Thanks for any help...
>>>>>> Steve
>>>>>
>>>>>
>>>>>
>>>>> --
>>>>> =====================================================================
>>>>> | Damir Buskulic                  | Universite de 
>>>>> Savoie/LAPP       |
>>>>> |                                 | Chemin de Bellevue, B.P. 
>>>>> 110    |
>>>>> | Tel : +33 (0)450091600          | F-74941 Annecy-le-Vieux 
>>>>> Cedex   |
>>>>> | e-mail: buskulic@lapp.in2p3.fr  | 
>>>>> FRANCE                          |
>>>>> =====================================================================
>>>>> mailto:buskulic@lapp.in2p3.fr
>>>>
>>



This archive was generated by hypermail 2b29 : Sat Jan 04 2003 - 23:51:08 MET