From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 23389 invoked by alias); 8 May 2006 14:00:23 -0000 Received: (qmail 23380 invoked by uid 22791); 8 May 2006 14:00:22 -0000 X-Spam-Check-By: sourceware.org Received: from easeserver.easesoftware.com (HELO easeserver.easesoftware.com) (64.192.143.210) by sourceware.org (qpsmtpd/0.31) with ESMTP; Mon, 08 May 2006 14:00:19 +0000 Received: from [64.192.143.213] (small-fry.easesoftware.com [64.192.143.213]) by easeserver.easesoftware.com (Postfix) with ESMTP id 68DF221FDC7; Mon, 8 May 2006 09:00:16 -0500 (CDT) In-Reply-To: <5b7094580605071552x7d5b5c50ue777a374b2a308a8@mail.gmail.com> References: <5b7094580605051429j3b4577c5o7d46dfb7f36fbc17@mail.gmail.com> <6FFD3C7B-3315-4FDE-8C09-508D3979C604@easesoftware.com> <5b7094580605071552x7d5b5c50ue777a374b2a308a8@mail.gmail.com> Mime-Version: 1.0 (Apple Message framework v749.3) Content-Type: text/plain; charset=US-ASCII; delsp=yes; format=flowed Message-Id: Cc: gcc-help Content-Transfer-Encoding: 7bit From: Perry Smith Subject: Re: gcc linking and address of template function Date: Mon, 08 May 2006 14:00:00 -0000 To: Brian Budge X-Mailer: Apple Mail (2.749.3) Mailing-List: contact gcc-help-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-help-owner@gcc.gnu.org X-SW-Source: 2006-05/txt/msg00083.txt.bz2 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, > double, CCStencil, BSphere >> ::operator()(BSphere 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(gsl_vector const*, void*, > gsl_vector*) > 00000000 W int ll_uv_f(gsl_vector const*, void*, > gsl_vector*) > 00000000 W int ll_uv_df(gsl_vector const*, void*, > gsl_matrix*) > 00000000 W int ll_uv_df(gsl_vector const*, void*, > gsl_matrix*) > 00000000 W int ll_uv_fdf(gsl_vector const*, void*, > gsl_vector*, gsl_matrix*) > 00000000 W int ll_uv_fdf(gsl_vector const*, void*, > gsl_vector*, gsl_matrix*) > > > Thanks! > Brian > > > On 5/7/06, Perry Smith 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 >> > int ll_uv_f(const gsl_vector *x, void *params, gsl_vector *f){ >> > LL_uv_data *lld = static_cast< LL_uv_data* > >> > (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 >> > int ll_uv_df(const gsl_vector *x, void *params, gsl_matrix *J){...} >> > >> > template >> > 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 dat(Vec(u,v), this); >> > gsl_multiroot_function_fdf f = {ll_uv_f, >> > ll_uv_df, >> > ll_uv_fdf, >> > 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(const gsl_vector *x, void >> *params, >> > gsl_vector *f, gsl_matrix *J); >> > template int ll_uv_fdf(const gsl_vector *x, void >> *params, >> > gsl_vector *f, gsl_matrix *J); >> > . >> > . >> > . >> > template int ll_uv_df(const gsl_vector *x, void *params, >> > gsl_matrix *J); >> > template int ll_uv_df(const gsl_vector *x, void *params, >> > gsl_matrix *J); >> > . >> > . >> > . >> > template int ll_uv_f(const gsl_vector *x, void *params, >> > gsl_vector *f); >> > template int ll_uv_f(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 >> > >> >> >