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

Hai Yi yihai2004 at gmail.com
Wed Jun 9 10:38:39 PDT 2010


Jeff you are absolutely right when you said that the inline keyword only
masks the problem. I did earlier the unit tests and invoked the underlying C
routines and the app crashed, citing "undefined reference to... "

Now with the new change, I can start testing the code.

Hai

On Wed, Jun 9, 2010 at 12:47 PM, Jeff Newmiller <jdnewmil at dcn.davis.ca.us>wrote:

> Glad you fixed it okay.  After thinking about it for awhile, I think the
> inline keyword was simply masking the problem.  If you had not yet written
> any code that called new_video_stream,  then that method would not be
> instantiated in your object code, and the offending reference to
> av_new_stream would not be there needing to be resolved.
>
> FWIW I recommend not modifying code from the ffmpeg C source to keep your
> C++ code better isolated from the C code.  If you follow this advice you
> should not need the ifdef at all, because the C compiler should never
> encounter the extern "C" syntax.
>
> "Hai Yi" <yihai2004 at gmail.com> wrote:
>
> >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 at 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 at dcn.davis.ca.us
> >> > <mailto:jdnewmil at 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 at gmail.com <mailto:yihai2004 at 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 at 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 at lists.lugod.org
> >> http://lists.lugod.org/mailman/listinfo/vox-tech
> >>
> >_______________________________________________
> >vox-tech mailing list
> >vox-tech at lists.lugod.org
> >http://lists.lugod.org/mailman/listinfo/vox-tech
>
> ---------------------------------------------------------------------------
> Jeff Newmiller                        The     .....       .....  Go Live...
> DCN:<jdnewmil at 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
> ---------------------------------------------------------------------------
> Sent from my phone. Please excuse my brevity.
> _______________________________________________
> vox-tech mailing list
> vox-tech at lists.lugod.org
> http://lists.lugod.org/mailman/listinfo/vox-tech
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.lugod.org/pipermail/vox-tech/attachments/20100609/7084d57c/attachment.htm 


More information about the vox-tech mailing list