[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
static members in shared libraries
From: |
Spaceman |
Subject: |
static members in shared libraries |
Date: |
12 Jul 2006 15:27:57 -0700 |
User-agent: |
G2/0.2 |
Hi There,
I'm not sure if this is the case of a misplaced compiler option, or
there is a bug in the compiler, but I get unexpected output when I use
the same class with a static member in both a shared library and an
executable, compiling under g++ on Linux. Perhaps the best way to
explain is with the aid of some code ... please bare with me !!
If I create a class that I want to use in my executable and a shared
library:
class CommonElement
{
public:
CommonElement(int i) { m_static = i; }
void PrintIt() { printf("My Value= %d\n", m_static);
private:
static int m_static; // Init to zero in cpp.
};
If I then decide to create my simple shared library with a single
exported function...
extern "C" void LibraryFn()
{
CommonElement loc(99);
loc.PrintIt();
}
And I also find it useful to do some work in my executable, that also
loads in the shared library dynamically using dlopen(), etc.
int main (int argc, char* argv[])
{
CommonElement exeElem(10);
// Use dlopen/dlsym to obtain LibraryFn()
exeElem.PrintIt(); // Display exe static value.
LibraryFn(); // Call library function to display output.
exeElem.PrintIt(); // Print out our exe static value again.
}
If I compile this to generate the shared library and executable using
the -fPIC option I get the following output:
My Value= 10;
My Value= 99;
My Value= 99;
However, The output I would expect is:
My Value= 10;
My Value= 99;
My Value= 10;
If I compile this without the -fPIC option I get the output I expect,
but I am forced to use -fPIC on a 64 bit machine, and after all .. I
think that is the right think to do !
Can anyone please help with this? It would be much appreciated. It
appears I end up using the same static member, even though it appears
in the symbol table of the shared library I create !
- static members in shared libraries,
Spaceman <=