LinuxQuestions.org
Welcome to the most active Linux Forum on the web.
Home Forums Tutorials Articles Register
Go Back   LinuxQuestions.org > Forums > Non-*NIX Forums > Programming
User Name
Password
Programming This forum is for all programming questions.
The question does not have to be directly related to Linux and any language is fair game.

Notices


Reply
  Search this Thread
Old 06-25-2002, 09:46 PM   #1
Hano
Member
 
Registered: Sep 2001
Location: Venezuela, Caracas
Distribution: RedHat 9.0
Posts: 196

Rep: Reputation: 30
why compiler gives undefined references on static members???


Heya,


Im getting this weirds undefined references at link-time when compiling a class with static members, any one may know why?


class AMRMesh {
...
static int Dim;
...
static AMRMesh* root;
....


then the errors i get from the member functions that access the static members are from the following kind.:

/tmp/ccqH023E.o(.AMRMesh::gnu.linkonce.t.Neighbour(int, int, AMRMesh *(*)(AMRMesh *, int, int))+0x192): undefined reference to `AMRMesh::RootGrid'
/tmp/ccqH023E.o(.AMRMesh::gnu.linkonce.t.Neighbour(int, int, AMRMesh *(*)(AMRMesh *, int, int))+0x1f3): undefined reference to `AMRMesh:: Dim'

... and lot others which refer to either AMRMesh:: Dim or AMRMesh::RootGrid, which are the only two static members of AMRMesh

Its there some kind of restriction on members functions accessing static members?

why god why?

Last edited by Hano; 06-25-2002 at 09:57 PM.
 
Old 06-25-2002, 10:08 PM   #2
crabboy
Senior Member
 
Registered: Feb 2001
Location: Atlanta, GA
Distribution: Slackware
Posts: 1,821

Rep: Reputation: 121Reputation: 121
What is the version on your compiler and linker?
Code:
g++ --version
ld -version
 
Old 06-25-2002, 10:11 PM   #3
Hano
Member
 
Registered: Sep 2001
Location: Venezuela, Caracas
Distribution: RedHat 9.0
Posts: 196

Original Poster
Rep: Reputation: 30
g++/gcc 2.96

GNU ld 2.11.90.0.8
 
Old 06-25-2002, 10:21 PM   #4
crabboy
Senior Member
 
Registered: Feb 2001
Location: Atlanta, GA
Distribution: Slackware
Posts: 1,821

Rep: Reputation: 121Reputation: 121
I tried writing a test program with static members and I had no problems linking. Can you post the smallest example possible where you can get the error?
 
Old 06-25-2002, 10:28 PM   #5
Hano
Member
 
Registered: Sep 2001
Location: Venezuela, Caracas
Distribution: RedHat 9.0
Posts: 196

Original Poster
Rep: Reputation: 30
------------------test.h------------------------------
#include <iostream.h>

class test {
public:
int a;
static int b;

test() {};
~test() {};

void STb() {
cout << b << endl;
};
};

-------------test.cpp

#include "test.h"

int main() {

test* inst;
inst = new (test);

inst->a=3;
inst->b=5;
// test::b=5; neither works

test::STb();
// neither inst->STb() changes nothing
};
 
Old 06-25-2002, 11:14 PM   #6
crabboy
Senior Member
 
Registered: Feb 2001
Location: Atlanta, GA
Distribution: Slackware
Posts: 1,821

Rep: Reputation: 121Reputation: 121
Static variables must be initialized in file scope:

test.cpp
Code:
#include "test.h"

int test::b = 0;

int main() 
{

   test* inst;
   inst = new (test);

   inst->a=3;
   inst->b=5;
   // test::b=5; neither works

   test::STb();
   // neither inst->STb() changes nothing
};
 
Old 06-25-2002, 11:16 PM   #7
crabboy
Senior Member
 
Registered: Feb 2001
Location: Atlanta, GA
Distribution: Slackware
Posts: 1,821

Rep: Reputation: 121Reputation: 121
I also had to change the member function STb to be static to call it without an object. I'm assuming that was just a typo when creating the example.
 
Old 06-25-2002, 11:52 PM   #8
Hano
Member
 
Registered: Sep 2001
Location: Venezuela, Caracas
Distribution: RedHat 9.0
Posts: 196

Original Poster
Rep: Reputation: 30
yes, it was a typo because i tried both forms, sorry bout that :^)


... but if a static member has to be intialized outside the class, what happens if i want to make the static variable private? i.e: i want the static variable to be changed/updated/handled/used from the methods implemented by the class, what should i do?


Thx :^)
 
Old 06-26-2002, 11:12 AM   #9
crabboy
Senior Member
 
Registered: Feb 2001
Location: Atlanta, GA
Distribution: Slackware
Posts: 1,821

Rep: Reputation: 121Reputation: 121
Initialize it after the class definition.

test.h
Code:
class test 
{
   private: 
      int a;
      static int b;

   public:
      test() {};
      ~test() {};

      void setb( int b1 ) { b = b1; };
      void seta( int a1 ) { a = a1; };

      static void STb() 
      {
         cout << b << endl;
      };
};

int test::b = 0;
test.cpp
Code:
#include "test.h"

int main() 
{

   test* inst;
   inst = new (test);

   inst->seta(3);
   inst->setb(5);
   //test::b=5; error private member 

   test::STb();
   // neither inst->STb() changes nothing
}
 
  


Reply



Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is Off
HTML code is Off



Similar Threads
Thread Thread Starter Forum Replies Last Post
Undefined references with static libraries Nightfox Programming 2 10-28-2005 06:43 PM
texinfo - undefined references during make fitret Linux - Software 1 06-18-2005 02:38 PM
about GCC compiler and static memory grupoapunte Programming 1 05-07-2005 07:11 PM
Qt 3.3.3 undefined references when linking Ch. 7 tutorial QtCoder Programming 3 11-07-2004 11:59 AM
Undefined references when linkin against Debian packaged libs stackoverflow32 Programming 3 08-08-2004 02:09 PM

LinuxQuestions.org > Forums > Non-*NIX Forums > Programming

All times are GMT -5. The time now is 01:14 PM.

Main Menu
Advertisement
My LQ
Write for LQ
LinuxQuestions.org is looking for people interested in writing Editorials, Articles, Reviews, and more. If you'd like to contribute content, let us know.
Main Menu
Syndicate
RSS1  Latest Threads
RSS1  LQ News
Twitter: @linuxquestions
Open Source Consulting | Domain Registration