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