[vox-tech] inline keyword solves "undefined reference" issue
Hai Yi
yihai2004 at gmail.com
Wed Jun 9 09:29:50 PDT 2010
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
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.lugod.org/pipermail/vox-tech/attachments/20100609/16a3de26/attachment.htm
More information about the vox-tech
mailing list