Thanks.

I've opened an issue with vendor and am banging on them to get me the
misisng header file so get_auto_event.cpp will (presumably) compile.

On Mon, Apr 20, 2009 at 8:35 AM, Tim Wescott <[email protected]> wrote:

> Joe Pruett wrote:
> >> All C++ gurus,
> >>
> >> I'm a C++ newbie, so be gentle ;)
> >>
> >> I'm trying to compile a vendor provided c++ file on RHEL 4, test_api
> .cpp,
> >> and on compile it dumps with an error:
> >>
> >> undefined reference to 'get_auto_event(event_ap*, int)'
> >>
> >> The file I'm compiling calls get_auto_event. This function is referenced
> in
> >> a header file autosys_api_auto.h that has this line:
> >>
> >> extern int get_auto_event(EVENT_API *eapi, int polling);
> >>
> >> Now in the same directory there is a get_auto_event.cpp file that has
> the
> >> fully defined function:
> >>
> >> int get_auto_event(EVENT_API *eapi, int polling);
> >> ...
> >>
> >> My question is, how does the compiler know about that get_auto_event.cpp
> >> defines get_auto_event from just the extern keyword in
> autosys_api_auto.h?
> >> Does it just match by the name? Do I have to compile get_auto_event.cpp
> >> before I can compile test_api.cpp, or will the compiler handle that
> >> automagically? (The fact that get_auto_event.cpp doesn't compile is
> another
> >> issue. That is trying to include a missing header file).
> >>
> >
> > not truly a c++ issue, but a linker issue.  to make your program work you
> > need to compile both files into object files and then link them together.
> > the simpleminded way is something like:
> >
> > g++ test_api.cpp get_auto_event.cpp -o test_api
> >
> > that will recompile both files every time.  more complex is to compile to
> > .o files and then link them together.  as richard indicated, usually that
> > would be done with a makefile and the make program so you don't have to
> > keep track of what files need to be rebuilt.  i would guess that your
> > sample code might have included a makefile, and if so, just type make and
> > see if that gets you what you want.
> >
> To expand:
>
> The "extern" keyword in C++ (and C, for that matter), tells the compiler
> "I'm defining this entity for you.  It's out there somewhere, and I'm
> going to take care of getting it to you later, but for now this is what
> you need to use it".  Think of it as a data sheet for the thing.  I use
> the word "entity" because you can use "extern" to define a function as
> done here, or to define some global variable that you wisely and
> sparingly want to make available (or foolishly and profligately want to
> make available).
>
> So when you compile test_api.cpp, the compiler puts in the code to
> get_auto_event, and it puts an entry into the .o file that tells the
> linker "Yo!  I need this function!".  Then when things get to the link
> step and nothing has the definition of get_auto_event (because you
> didn't compile to a get_auto_event.o file, and didn't submit it to the
> linker), the linker sees that it needs something it doesn't have and it
> bombs.
>
> So you need to get your get_auto_event.cpp file to compile, then you'll
> have the function you need for the link pass (or you'll have other
> things missing -- not that such things _ever_ happen when you're
> wrapping your arms around adopted code).
>
> --
> Tim Wescott
> Wescott Design Services
> Voice: 503-631-7815
> Cell:  503-349-8432
> http://www.wescottdesign.com
>
>
> _______________________________________________
> PLUG mailing list
> [email protected]
> http://lists.pdxlinux.org/mailman/listinfo/plug
>



-- 
Daniel B. Herrington
Director of Field Services
Robert Mark Technologies
[email protected]
o: 651-769-2574
m: 503-358-8575
_______________________________________________
PLUG mailing list
[email protected]
http://lists.pdxlinux.org/mailman/listinfo/plug

Reply via email to