[Search for users] [Overall Top Noters] [List of all Conferences] [Download this site]

Conference turris::c_plus_plus

Title:C++
Notice:Read 1.* and use keywords (e.g. SHOW KEY/FULL KIT_CXX_VAX_VMS)
Moderator:DECCXX::AMARTIN
Created:Fri Nov 06 1987
Last Modified:Thu Jun 05 1997
Last Successful Update:Fri Jun 06 1997
Number of topics:3604
Total number of notes:18242

3467.0. "undefined symbol with inline function" by AWECIM::KLEE () Wed Feb 26 1997 13:30

Why do I get an "undefined symbol" link-time error when "get_name" is
inline and the implementation of the member function is not in the H
file?  There is no error when the implementation is defined in the
class declaration and there is no error when the function is not
inline.

$cxx/version nl:
DEC C++ V5.4-010 on OpenVMS Alpha V6.1
$ cxx t
$cxx t1
$cxxlink t1,t
%LINK-W-NUDFSYMS, 1 undefined symbol:
%LINK-I-UDFSYM,         String Oper::get_name(void) const
%LINK-W-USEUNDEF, undefined symbol String Oper::get_name(void) const referenced
        in psect $LINK$ offset %X000000A0
        in module T1 file CIMENG11$:[EKD_V010.WRK.KLEE.SRC]T1.OBJ;5

Thanks,
Kamyee (and Bill too)

=========================
// t.h
#if !defined T_H
#define T_H 

#include <string.hxx>

class Oper
{
private:
  String name;
public:
  Oper ( void );	// constructor
  String get_name( void ) const;
};

#endif                                  /* T_H */

===================================
// t.cxx
#include <iostream.hxx>
#include <t.h>

Oper::Oper( void) { this->name = "Blah"; }

inline             // THIS KEYWORD CAUSES UNDEFINED SYMBOL
String Oper::get_name ( void ) const {return this->name;}

==================================
//t1.cxx
#include <iostream.hxx>
#include <t.h>

main( void )
{
  Oper aOper;
  cout << aOper.get_name() << endl;
}
T.RTitleUserPersonal
Name
DateLines
3467.1SPECXN::DERAMODan D'EramoWed Feb 26 1997 14:1027
        File T1.OBJ has a reference to the externally defined
        "String Oper::get_name(void) const".  So at link time,
        there must be a definition of that available.
        
        T1.OBJ has no such definition because there is none in
        the source.
        
        T.OBJ has no such definition, I believe because under
        ARM rules the "inline" keyword means the definition there
        has internal linkage.

        It would be as if you had done the following in C/C++
        
        /* T1 */
        	extern void f(void);
        	int main() { f(); return 0; }
        
        /* T */
        	static void f(void) {}
        
        The definition of f in T has internal linkage and so at link
        time does not satify T1's need for a definition of f.
        
        I think the latest draft of the evolving standard changes that
        ARM rule about inline and internal linkage.
        
        Dan