ITEM: CK7583L

How to eliminate duplicate symbols from the Rogue Wave C++ libraries



ENV:  (AIX 3.2.5, CSet++ version 2) and (AIX 4, CSet++ version 3)
      Rogue Wave Tools.h++ Foundation Class library for C++
        Programming version 6.
      Rogue Wave Math.h++ C++ Class Library for Developing
        Numberical Applications version 5.

DESC:  When linking a C++ program that uses Rogue Wave templates
       classes I am receiving duplicate symbols for the Rogue Wave
       template class member functions.  WHY?  
       

ACTION: 

Determining the answer to this question requires an understanding of
how the user's source code is organized. This answer assumes that the 
user of the Rogue Wave C++ template classes has NOT created any 
shared libraries themselves that contain functions that instantiate
C++ template classes.  

There are basically four steps in eliminating 
duplicate symbols related to C++ template classes.

NOTE: This assumes that only a program is being built that links
with the Rogue Wave shared libraries and NO shared libraries
containing C++ template classes are being built by the programmer.
When building shared libraries that instantiate C++ templates
duplicate symbols may be present during linking and it may NOT 
be possible to eliminate ALL of the duplicate symbols.  


1) First understand the default behavior of the xlC compiler.
2) Second determine/verify how the Rogue Wave source code was 
   configured and compiled on the system.
3) Third possibly reconfigure, recompile, and rebuild the 
   Rogue Wave shared libraries.  
4) Then recompile user's source and relink with the Rogue Wave 
   shared libraries.

1) UNDERSTANDING THE DEFAULT BEHAVIOR OF THE XLC COMPILER WITH 
   RESPECT TO C++ TEMPLATE GENEARTION

   There are two ways that C++ template classes can be instantiated
   by the xlC compiler on AIX.
   C++ template classes may be instantiated at COMPILE time or at
   LINK time.  The way the you control which of the two instantiation
   methods are used is based on how you organize your source code 
   and not directly by compiler options.  
     COMPILE TIME:  Any time a C++ source file has both the C++
       template class declarations and function definitions visible 
       to a compilation unit (i.e. file.C) and the source code in the
       file declares a variable of that C++ template class
       type, then C++ Template class functions will be generated 
       in the object module (file.o) by the compiler.
       NOTE: For example if you instantiate the same template class
       with 5 different data types in each of 100 .C files then
       let say also that there were 20 member functions in the class
       then using COMPILE time template class instantiation would
       result in  (20 functions)*(5 data types)*(100 files) would 
       produce a total of 10,000 symbols.  This ultimately results
       in oversize executables and long compile/link times.  This 
       case would be idea for using link time instantiation. Using 
       link time template instantiation would result in 
       (20 functions) * (5 data types) = 100 symbols and would be
       placed in a separate .o file in the subdirectory called
       tempinc that would automatically be created. 

     LINK TIME: Any time a C++ source file has only the C++
       template class declarations which were \#include from 
       another file (ie .h file) and there is a corresponding
       .c file in the include directory where the .h file exists
       and if the source file (file.C) declares a variable to
       be of the C++ template class type, then link time template
       generation (automatic) will be used.  By default a tempinc
       directory will be created in the current working directory.
       The "tempinc" directory may be changed by using the 
       -qtempinc compile/link option.
       A .C file will be created in that directory.  When a C++
       program is linked with the xlC command and a tempinc directory
       is found any .C files in that directory will first be compiled
       and then the .o files will be added to the link line after all
       user specified libraries.  NOTE: Using the -v (verbose) 
       option on a compile/link line will indicate this.

  A more in-depth discussion of this topic is available in the
  IBM C Set ++ for AIX User' Guide Version 3 Release 1 in Chapter 14.

2) DETERMINING HOW THE ROGUE WAVE C++ CLASS LIBRARIES ARE
   CONFIGURED ON AIX
    
   The rogue wave product can be installed in any directory.
   This directory must be obtained from the person who installed
   the rogue wave product. HINT: You may determine this from the
   by typing make -n and check the output for any -I "directory"
   that are being used in a compile or link line.

   cd "rogue wave base install directory"
   cd ./rw
   grep RW_COMPILE_INSTANTIATE compiler.h
   There should be numerous lines.  If the RW_COMPILE_INSTANTIATE
   macro is defined (typically equal to 1) then assuming that 
   compiler.h file was used (and not modified) when the 
   Rogue wave libraries were built, then the RW C++ classes were 
   configured for compile time instantiation.
   Also do a ls -la *.c
   If there are no .c files linked to the .cc files then
   this is another indication that the Rogue Wave C++
   template classes were built to use compile time template
   instantiation.
   

   On the other hand if the RW_COMPILE_INSTANTIATE macro 
   in the compiler.h file is not defined (either commented out
   or defined to be zero and there are .c files that are linked
   to the corresponding .cc files in the rw include directory,
   then the Rogue Wave C++ template classes are properly configured
   for link time or (Automatic) template generation on AIX.

3) RECONFIGURING THE ROGUE WAVE C++ CLASS LIBRARY
   
   To change the C++ template instantiation method that the
   Rogue Wave libraries use, run the config script in the Rogue Wave
   bin directory.
   A. cd "rogue wave base install directory"
     ./bin/config
   B. vi ./rw/config.data
     for COMPILE time instantiation verify that the line 
         RW_COMPILE_INSTANTIATE=1
     is present.
     for LINK time instantiation verify that the line
         RW_COMPILE_INSTANTIATE=0
      is present.
   C. save file with desired line.
   D. ./bin/config_compiler  
      NOTE: This will create symbolic links .c to .cc files in the
      rw directory.  The .c files by default is used by the 
      xlC compiler to obtain the template class function definitions.

   E. Rebuild the Rogue Wave libraries
      i.e for the general tools classes 
        ./bin/config_make toolsrc
        cd ./toolsrc
        make
     
      Repeat tasks in step E for each of the rogue wave 
      C++ class library products. For example, in the case of the 
      math library substitute mathsrc for toolsrc.

4)RECOMPILE THE USER PROGRAM AND RELINK TO THE RECOMPILED ROGUE WAVE
  LIBRARIES

       


Support Line: How to eliminate duplicate symbols from the Rogue Wave C++ libraries ITEM: CK7583L
Dated: February 1997 Category: N/A
This HTML file was generated 99/06/24~13:30:17
Comments or suggestions? Contact us