public inbox for gcc-help@gcc.gnu.org
 help / color / mirror / Atom feed
From: Perry Smith <pedz@easesoftware.com>
To: Brian Budge <brian.budge@gmail.com>
Cc: gcc-help <gcc-help@gcc.gnu.org>
Subject: Re: gcc linking and address of template function
Date: Mon, 08 May 2006 14:00:00 -0000	[thread overview]
Message-ID: <A614CDFF-F11B-4E34-A4A2-6C4CD0F104B2@easesoftware.com> (raw)
In-Reply-To: <5b7094580605071552x7d5b5c50ue777a374b2a308a8@mail.gmail.com>

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@easesoftware.com> 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
>> >
>>
>>
>

  reply	other threads:[~2006-05-08 14:00 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2006-05-05 21:29 Brian Budge
2006-05-07 11:56 ` Perry Smith
2006-05-07 22:53   ` Brian Budge
2006-05-08 14:00     ` Perry Smith [this message]
2006-05-11 10:41 ` Brian Gough
2006-05-11 13:39   ` Brian Budge

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=A614CDFF-F11B-4E34-A4A2-6C4CD0F104B2@easesoftware.com \
    --to=pedz@easesoftware.com \
    --cc=brian.budge@gmail.com \
    --cc=gcc-help@gcc.gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).