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 <jdnew...@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" <yihai2...@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 <jdnew...@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 < > jdnew...@dcn.davis.ca.us > >> > <mailto:jdnew...@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" <yihai2...@gmail.com <mailto:yihai2...@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:<jdnew...@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 > > --------------------------------------------------------------------------- > Jeff Newmiller The ..... ..... Go Live... > DCN:<jdnew...@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@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