Template linker errors with gcc 4.6.3

Jonathan Wakely jwakely.gcc@gmail.com
Mon Nov 4 15:18:00 GMT 2013

On 4 November 2013 15:07, David Aldrich wrote:
> Hi
> We have a mature project that builds fine with gcc 4.4, but when we build it with gcc 4.6.3 on Ubuntu 12.04 LTS  we get linker errors that are related to templates.

Are you using the same linker version in both cases?  That might be as
significant as the compiler version.

> I am finding it difficult to understand the errors.  As a general question, was template processing significantly changed between gcc 4.4 and 4.6 in a way that might cause linker errors?

Not that I can think of.

> Here is an example of an error that I am getting:
> + make
> g++ -o _gnuRelease/myapp -Wl,-whole-archive,-export-dynamic ../Kernel/_gnuRelease/libKernel.a    -lboost_python-mt-py27 -lpython2.7 -Wl,--no-whole-archive -ldl
> ../Kernel/_gnuRelease/libKernel.a(EVD.o): In function `eigSymmetric(Matrix<double> const&, Matrix<double>&, Matrix<double>&, unsigned int)':
> EVD.cpp:(.text+0x25a): undefined reference to `Matrix<double>::eye(unsigned int, double)'

How is EVD.o compiled?

> Now, the only line of code in eigSymmetric() that calls eye() is:
>     int N = a_X.numRows();
>     ...
>     a_V = Matrix<double>::eye(N);
> so I don't understand why the linker is looking for `Matrix<double>::eye(unsigned int, double)' rather than for `Matrix<double>::eye(int)'.

At a guess, maybe because the function is declared as something like
Matrix<T>::eye(unsigned, double = 0.0)
i.e. just because you pass the function an int doesn't mean that's
what the function is declared to take.

> There are also many other errors:
> EVD.cpp:(.text+0x1c6e): undefined reference to `Matrix<std::complex<double> >::Matrix()'
> EVD.cpp:(.text+0x1c7d): undefined reference to `Matrix<double>::Matrix()'
> EVD.cpp:(.text+0x1f9e): undefined reference to `Matrix<std::complex<double> >::Matrix(unsigned int, unsigned int, std::vector<std::complex<double>, std::allocator<std::complex<double> > > const&, MatrixConst::EOrdering)'
> EVD.cpp:(.text+0x1fe5): undefined reference to `Matrix<std::complex<double> > operator*<std::complex<double> >(Matrix<std::complex<double> > const&, Matrix<std::complex<double> > const&)'
> EVD.cpp:(.text+0x2006): undefined reference to `Matrix<std::complex<double> > operator-<std::complex<double> >(Matrix<std::complex<double> > const&, Matrix<std::complex<double> > const&)'
> EVD.cpp:(.text+0x2080): undefined reference to `Matrix<std::complex<double> >::frob2() const'
> <snip>

It looks like every member of Matrix is missing.

Either the file EVD.o is compiled with -fno-implicit-templates or
those functions are not defined in EVD.cpp

Function templates must either be defined in every file that uses them
or explicitly instantiated.

But you haven't provided nearly enough information to know what the
specific problem is in your case.

More information about the Gcc-help mailing list