| 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 |
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.R | Title | User | Personal Name | Date | Lines |
|---|---|---|---|---|---|
| 3467.1 | SPECXN::DERAMO | Dan D'Eramo | Wed Feb 26 1997 11:10 | 27 | |
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
| |||||