Re: gcc linking and address of template function

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

 



I'm hoping someone else might chime in and help you out as well. I'm just guessing here.

But it looks to me as if you are referencing non-template functions with names like ll_uv_fdf somewhere in your code. Is that possible?

I would assume that a reference to a template function would have the template parameter in the names since the definitions have the template parameter in their names.

I would do the nm --demangle of your .o's again and grep for one specific name like "ll_uv_fdf" and see what pops out. I'm hoping you can see the pattern of what a reference looks like and what a definition looks like. Also, maybe not include one of the .o files that has the instanciations and see what errors pop out to try and figure out if an undefined reference to a function from a template has the template parameter in the name or not.

HTH,
Perry

On May 7, 2006, at 5:52 PM, Brian Budge wrote:

Hi Perry -

Here are the errors I'm getting:

test/tester.o: In function
`STLocate2<OpenMesh::PolyMesh_ArrayKernelT<OpenMesh::DefaultTraits>,
double, CCStencil, BSphere<double, 2, OpenMesh::FaceHandle>
::operator()(BSphere<double, 2, OpenMesh::FaceHandle> const&, bool)':
tester.cc: (.gnu.linkonce.t._ZN9STLocate2IN8OpenMesh21PolyMesh_ArrayKernelTINS0_1 3DefaultTraitsEEEd22CCStencil7BSphereIdLi2ENS0_10FaceHandleEEEclERKS7_ b+0x30e):
undefined reference to `ll_uv_f(gsl_vector const*, void*,
gsl_vector*)'
tester.cc: (.gnu.linkonce.t._ZN9STLocate2IN8OpenMesh21PolyMesh_ArrayKernelTINS0_1 3DefaultTraitsEEEd22CCStencil7BSphereIdLi2ENS0_10FaceHandleEEEclERKS7_ b+0x318):
undefined reference to `ll_uv_df(gsl_vector const*, void*,
gsl_matrix*)'
tester.cc: (.gnu.linkonce.t._ZN9STLocate2IN8OpenMesh21PolyMesh_ArrayKernelTINS0_1 3DefaultTraitsEEEd22CCStencil7BSphereIdLi2ENS0_10FaceHandleEEEclERKS7_ b+0x322):
undefined reference to `ll_uv_fdf(gsl_vector const*, void*,
gsl_vector*, gsl_matrix*)'

Note I've only instantiated my classes with the template type =
CCStencil, so there aren't any errors regarding BSStencil.

When I do an nm on one of my .o files (which is on the link line), I get this:
00000000 W _Z7ll_uv_fI21BSStencilEiPK10gsl_vectorPvPS1_
00000000 W _Z7ll_uv_fI22CCStencilEiPK10gsl_vectorPvPS1_
00000000 W _Z8ll_uv_dfI21BSStencilEiPK10gsl_vectorPvP10gsl_matrix
00000000 W _Z8ll_uv_dfI22CCStencilEiPK10gsl_vectorPvP10gsl_matrix
00000000 W _Z9ll_uv_fdfI21BSStencilEiPK10gsl_vectorPvPS1_P10gsl_matrix
00000000 W _Z9ll_uv_fdfI22CCStencilEiPK10gsl_vectorPvPS1_P10gsl_matrix

nm --demangle gives:

00000000 W int ll_uv_f<BSStencil>(gsl_vector const*, void*, gsl_vector*) 00000000 W int ll_uv_f<CCStencil>(gsl_vector const*, void*, gsl_vector*) 00000000 W int ll_uv_df<BSStencil>(gsl_vector const*, void*, gsl_matrix*) 00000000 W int ll_uv_df<CCStencil>(gsl_vector const*, void*, gsl_matrix*)
00000000 W int ll_uv_fdf<BSStencil>(gsl_vector const*, void*,
gsl_vector*, gsl_matrix*)
00000000 W int ll_uv_fdf<CCStencil>(gsl_vector const*, void*,
gsl_vector*, gsl_matrix*)


Thanks!
 Brian


On 5/7/06, Perry Smith <pedz@xxxxxxxxxxxxxxxx> wrote:
I may be right in front of my face but I don't see it.  Can you send
a couple lines of what the link's error messages are like?

On May 5, 2006, at 4:29 PM, Brian Budge wrote:

> Hi all -
>
> I'm attempting to use gsl (gnu scientific library) from my C++
> program. gsl is a C program, and I need to pass function pointers to
> gsl to make it do it's magic on my data.
>
> The problem I'm having stems from the fact that I need my functions to
> be template functions.
>
> I can get everything to compile, but I can't get it to link.
>
> The gist is like this:
>
> template<class Stencil>
> int ll_uv_f(const gsl_vector *x, void *params, gsl_vector *f){
>    LL_uv_data<Stencil> *lld = static_cast< LL_uv_data<Stencil>* >
> (params);
>    const real a = gsl_vector_get(x,0);
>    const real b = gsl_vector_get(x,1);
>    Vec v = lld->ll->eval(a, b) - lld->pt;
>    for(int i = 0; i < 2; ++i){
>        gsl_vector_set(f, i, v[i]);
>    }
>    return GSL_SUCCESS;
> }
>
> template<class Stencil>
> int ll_uv_df(const gsl_vector *x, void *params, gsl_matrix *J){...}
>
> template<class Stencil>
> int ll_uv_fdf(const gsl_vector *x, void *params, gsl_vector *f,
> gsl_matrix *J){...}
>
> The calling function then contains the code:
>
> LL_uv_data<BaseStencil> dat(Vec(u,v), this);
> gsl_multiroot_function_fdf f = {ll_uv_f<BaseStencil>,
>                                           ll_uv_df<BaseStencil>,
>                                           ll_uv_fdf<BaseStencil>,
>                                           2, &dat};
>
> I also explicitly instantiate the template functions for several
> instances in a .cc file:
>
> //explicit instantiation of template functions
> template int ll_uv_fdf<CCStencil>(const gsl_vector *x, void *params,
> gsl_vector *f, gsl_matrix *J);
> template int ll_uv_fdf<BSStencil>(const gsl_vector *x, void *params,
> gsl_vector *f, gsl_matrix *J);
> .
> .
> .
> template int ll_uv_df<CCStencil>(const gsl_vector *x, void *params,
> gsl_matrix *J);
> template int ll_uv_df<BSStencil>(const gsl_vector *x, void *params,
> gsl_matrix *J);
> .
> .
> .
> template int ll_uv_f<CCStencil>(const gsl_vector *x, void *params,
> gsl_vector *f);
> template int ll_uv_f<BSStencil>(const gsl_vector *x, void *params,
> gsl_vector *f);
> .
> .
> .
>
> The program compiles fine, and the functions int ll_uv_*() are found
> by the nm utility to be in a .o file.
>
> The program still won't link.  Anyone have any ideas?  Is this
> something I'm doing wrong? The gcc version is 3.4.5-r1, and this is
> on a xeon box running linux.
>
> Thanks,
>  Brian
>





[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