l i n u x - u s e r s - g r o u p - o f - d a v i s
L U G O D
 
Next Meeting:
September 2: Social gathering
Next Installfest:
TBD
Latest News:
Aug. 18: Discounts to "Velocity" in NY; come to tonight's "Photography" talk
Page last updated:
2010 Jun 09 09:47

The following is an archive of a post made to our 'vox-tech mailing list' by one of its subscribers.

Report this post as spam:

(Enter your email address)
Re: [vox-tech] inline keyword solves "undefined reference" issue
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [vox-tech] inline keyword solves "undefined reference" issue



thanks Jeff, I wrapped the #include with

#ifdef __cplusplus
extern "C"{
#endif

...

#ifdef __cplusplus
}
#endif

and the inline problem is gone, it's no long needed, the app works like a charm!

Thought: I did wrap with "extern C{}" before, but I didn't put the conditional macro (#ifdef __cplusplus) then as I did it now, guess I used it the wrong way then.

Thanks again, Hai


On Wed, Jun 9, 2010 at 2:31 AM, Jeff Newmiller <jdnewmil@dcn.davis.ca.us> wrote:
Hai Yi wrote:
> Thanks Jeff. However, the header file of those C routines are included
> in ffmpegmgr.h, which is in turn included by ffmpegmgr.cpp.
>
> The "undefined reference " normally indicates that the functions's
> definitions are not found, and it takes place when doing the linker.

I am aware of that.  However, if you don't have your calls properly declared
then the linking may fail.

> The
> libraries, libavcodec, etc, have been specified from the g++ command
> line, and seems to work - only that I need to make the encapulated
> member function in ffmpegmgr.cpp inline to eliminate the linker error:
>
> inline void FFMpegMgr::new_video_stream(AVFormatContext *oc)
> {
>    ...
>     st = av_new_stream(oc, oc->nb_streams);
>    ...
> }

I cannot explain that.  Adding the inline keyword to new_video_stream
eliminates new_video_stream from the linking process (being placed inline,
there is no need to link it), but should have no effect on the link-ability
of av_new_stream.

Are you wrapping your C declarations as seen from C++ in extern "C" {}
blocks? This is often done by wrapping the #include statement for the C
header file in your cpp or C++ header files.

> Also, the lib that I specified is *.a, will it be different if the lib
> is *.so ?

If you declare your objects correctly, there should be no need for source
code changes between static and shared library linking.

> Thanks,
> Hai
>
>
> On Mon, Jun 7, 2010 at 1:26 AM, Jeff Newmiller <jdnewmil@dcn.davis.ca.us
> <mailto:jdnewmil@dcn.davis.ca.us>> wrote:
>
>     Seems more likely that you haven't included the declarations for the
>     C routines in your cpp file. Would need to see more context to diagnose.
>
>     "Hai Yi" <yihai2004@gmail.com <mailto:yihai2004@gmail.com>> wrote:
>
>      >Hello all:
>      >
>      >I created a class FFMpegMgr and a method init(); inside init() I
>     just put
>      >three ffmpeg api there:
>      >avcodec_register_all();
>      >avdevice_register_all();
>      > av_register_all();
>      >
>      >The source file ffmpegmgr.cpp look like this:
>      >
>      > void FFMpegMgr::init() {
>      >    avcodec_register_all();
>      >    avdevice_register_all();
>      >    av_register_all();
>      >
>      >}
>      >
>      >Now I got a "undefined reference to avcodec_register_all" error.
>      >
>      >if I put that body in the class declaration or add a "inline"
>     keyword, that
>      >problem was gone and the compilation succeeded.
>      >
>      >question is, do those three functions, which are C functions
>     defined in
>      >avcodec.h,  have to be used only in the inline functions in C++?
>      >
>      >Sorry if it appear naive - I've been out of touch with C/C++ for a
>     while.
>      >
>      >Thanks!
>      >Hai


--
---------------------------------------------------------------------------
Jeff Newmiller                        The     .....       .....  Go Live...
DCN:<jdnewmil@dcn.davis.ca.us>        Basics: ##.#.       ##.#.  Live Go...
                                      Live:   OO#.. Dead: OO#..  Playing
Research Engineer (Solar/Batteries            O.O#.       #.O#.  with
/Software/Embedded Controllers)               .OO#.       .OO#.  rocks...1k
---------------------------------------------------------------------------
_______________________________________________
vox-tech mailing list
vox-tech@lists.lugod.org
http://lists.lugod.org/mailman/listinfo/vox-tech

_______________________________________________
vox-tech mailing list
vox-tech@lists.lugod.org
http://lists.lugod.org/mailman/listinfo/vox-tech


LinkedIn
LUGOD Group on LinkedIn
Sign up for LUGOD event announcements
Your email address:
facebook
LUGOD Group on Facebook
'Like' LUGOD on Facebook:

Hosting provided by:
Sunset Systems
Sunset Systems offers preconfigured Linux systems, remote system administration and custom software development.

LUGOD: Linux Users' Group of Davis
PO Box 2082, Davis, CA 95617
Contact Us

LUGOD is a 501(c)7 non-profit organization
based in Davis, California
and serving the Sacramento area.
"Linux" is a trademark of Linus Torvalds.

Sponsored in part by:
EDGE Tech Corp.
For donating some give-aways for our meetings.