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

Jeff Newmiller jdnewmil at dcn.davis.ca.us
Wed Jun 9 09:47:04 PDT 2010


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.


More information about the vox-tech mailing list