[PLUG] C++ extern keyword

Tim Wescott tim at wescottdesign.com
Mon Apr 20 15:35:57 UTC 2009


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





More information about the PLUG mailing list