template instantiation with gcc 4.x

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi,

We have to port code to gcc 4.2.1 (linux), and most works well, except 
instantiation of templates in a dynamic library. I generated a minmal example 
to clearify my problem:

// ********** TemplateTest.H
#ifndef TESTCLASS
#define TESTCLASS

template <class X> class TestClass {
public:
  TestClass(const X &x) : m_x(x) {}
  X getX();
private:
  X m_x;
};
#endif

// ********* TemplateTest.cpp
#include "TestClass.H"

template <class X> X TestClass<X>::getX() {
  return this -> m_x;
}

template class TestClass<int>;

// *********** testMain.cpp
#include "TestClass.H"

int main(int argc, char **argv) {
  TestClass<int> a(4);
  a.getX();
  return 0;
}

So I compile (here as well, I took away all flags I think are not important 
here):
g++ -I. -c TestClass.cpp
g++ -shared -o libTestClass.so TestClass.o
g++ -I. -L. -lTestClass testMain.cpp

The first two commands work fine, but the compilation of testMain reveals (as 
the nm command does) that the symbols are not defined:

testMain.cpp:(.text+0x31): undefined reference to `TestClass<int>::getX()'

I read some information, like the gcc manual 
(http://gcc.gnu.org/onlinedocs/gcc-4.4.1/gcc/Template-Instantiation.html#Template-Instantiation), 
but my attempts to follow the advises were without success.

Thanks to anybody who can make my example work without forcing the 
implementation of getX() to be compiled into any object using it or making 
getX inline. I know which instantiations I need (here just int) when building 
the library.

Greetings

Volker


[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux