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 &quot;undefined reference to... &quot;<br>
<br>Now with the new change, I can start testing the code.<br><br>Hai<br><br><div class="gmail_quote">On Wed, Jun 9, 2010 at 12:47 PM, Jeff Newmiller <span dir="ltr">&lt;<a href="mailto:jdnewmil@dcn.davis.ca.us">jdnewmil@dcn.davis.ca.us</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">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.<br>

<br>
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 &quot;C&quot; syntax.<br>

<div><div></div><div class="h5"><br>
&quot;Hai Yi&quot; &lt;<a href="mailto:yihai2004@gmail.com">yihai2004@gmail.com</a>&gt; wrote:<br>
<br>
&gt;thanks Jeff, I wrapped the #include with<br>
&gt;<br>
&gt;#ifdef __cplusplus<br>
&gt;extern &quot;C&quot;{<br>
&gt;#endif<br>
&gt;<br>
&gt;...<br>
&gt;<br>
&gt;#ifdef __cplusplus<br>
&gt;}<br>
&gt;#endif<br>
&gt;<br>
&gt;and the inline problem is gone, it&#39;s no long needed, the app works like a<br>
&gt;charm!<br>
&gt;<br>
&gt;Thought: I did wrap with &quot;extern C{}&quot; before, but I didn&#39;t put the<br>
&gt;conditional macro (#ifdef __cplusplus) then as I did it now, guess I used it<br>
&gt;the wrong way then.<br>
&gt;<br>
&gt;Thanks again, Hai<br>
&gt;<br>
&gt;<br>
&gt;On Wed, Jun 9, 2010 at 2:31 AM, Jeff Newmiller &lt;<a href="mailto:jdnewmil@dcn.davis.ca.us">jdnewmil@dcn.davis.ca.us</a>&gt;wrote:<br>
&gt;<br>
&gt;&gt; Hai Yi wrote:<br>
&gt;&gt; &gt; Thanks Jeff. However, the header file of those C routines are included<br>
&gt;&gt; &gt; in ffmpegmgr.h, which is in turn included by ffmpegmgr.cpp.<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; The &quot;undefined reference &quot; normally indicates that the functions&#39;s<br>
&gt;&gt; &gt; definitions are not found, and it takes place when doing the linker.<br>
&gt;&gt;<br>
&gt;&gt; I am aware of that.  However, if you don&#39;t have your calls properly<br>
&gt;&gt; declared<br>
&gt;&gt; then the linking may fail.<br>
&gt;&gt;<br>
&gt;&gt; &gt; The<br>
&gt;&gt; &gt; libraries, libavcodec, etc, have been specified from the g++ command<br>
&gt;&gt; &gt; line, and seems to work - only that I need to make the encapulated<br>
&gt;&gt; &gt; member function in ffmpegmgr.cpp inline to eliminate the linker error:<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; inline void FFMpegMgr::new_video_stream(AVFormatContext *oc)<br>
&gt;&gt; &gt; {<br>
&gt;&gt; &gt;    ...<br>
&gt;&gt; &gt;     st = av_new_stream(oc, oc-&gt;nb_streams);<br>
&gt;&gt; &gt;    ...<br>
&gt;&gt; &gt; }<br>
&gt;&gt;<br>
&gt;&gt; I cannot explain that.  Adding the inline keyword to new_video_stream<br>
&gt;&gt; eliminates new_video_stream from the linking process (being placed inline,<br>
&gt;&gt; there is no need to link it), but should have no effect on the link-ability<br>
&gt;&gt; of av_new_stream.<br>
&gt;&gt;<br>
&gt;&gt; Are you wrapping your C declarations as seen from C++ in extern &quot;C&quot; {}<br>
&gt;&gt; blocks? This is often done by wrapping the #include statement for the C<br>
&gt;&gt; header file in your cpp or C++ header files.<br>
&gt;&gt;<br>
&gt;&gt; &gt; Also, the lib that I specified is *.a, will it be different if the lib<br>
&gt;&gt; &gt; is *.so ?<br>
&gt;&gt;<br>
&gt;&gt; If you declare your objects correctly, there should be no need for source<br>
&gt;&gt; code changes between static and shared library linking.<br>
&gt;&gt;<br>
&gt;&gt; &gt; Thanks,<br>
&gt;&gt; &gt; Hai<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; On Mon, Jun 7, 2010 at 1:26 AM, Jeff Newmiller &lt;<a href="mailto:jdnewmil@dcn.davis.ca.us">jdnewmil@dcn.davis.ca.us</a><br>
&gt;&gt; &gt; &lt;mailto:<a href="mailto:jdnewmil@dcn.davis.ca.us">jdnewmil@dcn.davis.ca.us</a>&gt;&gt; wrote:<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;     Seems more likely that you haven&#39;t included the declarations for the<br>
&gt;&gt; &gt;     C routines in your cpp file. Would need to see more context to<br>
&gt;&gt; diagnose.<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;     &quot;Hai Yi&quot; &lt;<a href="mailto:yihai2004@gmail.com">yihai2004@gmail.com</a> &lt;mailto:<a href="mailto:yihai2004@gmail.com">yihai2004@gmail.com</a>&gt;&gt; wrote:<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;      &gt;Hello all:<br>
&gt;&gt; &gt;      &gt;<br>
&gt;&gt; &gt;      &gt;I created a class FFMpegMgr and a method init(); inside init() I<br>
&gt;&gt; &gt;     just put<br>
&gt;&gt; &gt;      &gt;three ffmpeg api there:<br>
&gt;&gt; &gt;      &gt;avcodec_register_all();<br>
&gt;&gt; &gt;      &gt;avdevice_register_all();<br>
&gt;&gt; &gt;      &gt; av_register_all();<br>
&gt;&gt; &gt;      &gt;<br>
&gt;&gt; &gt;      &gt;The source file ffmpegmgr.cpp look like this:<br>
&gt;&gt; &gt;      &gt;<br>
&gt;&gt; &gt;      &gt; void FFMpegMgr::init() {<br>
&gt;&gt; &gt;      &gt;    avcodec_register_all();<br>
&gt;&gt; &gt;      &gt;    avdevice_register_all();<br>
&gt;&gt; &gt;      &gt;    av_register_all();<br>
&gt;&gt; &gt;      &gt;<br>
&gt;&gt; &gt;      &gt;}<br>
&gt;&gt; &gt;      &gt;<br>
&gt;&gt; &gt;      &gt;Now I got a &quot;undefined reference to avcodec_register_all&quot; error.<br>
&gt;&gt; &gt;      &gt;<br>
&gt;&gt; &gt;      &gt;if I put that body in the class declaration or add a &quot;inline&quot;<br>
&gt;&gt; &gt;     keyword, that<br>
&gt;&gt; &gt;      &gt;problem was gone and the compilation succeeded.<br>
&gt;&gt; &gt;      &gt;<br>
&gt;&gt; &gt;      &gt;question is, do those three functions, which are C functions<br>
&gt;&gt; &gt;     defined in<br>
&gt;&gt; &gt;      &gt;avcodec.h,  have to be used only in the inline functions in C++?<br>
&gt;&gt; &gt;      &gt;<br>
&gt;&gt; &gt;      &gt;Sorry if it appear naive - I&#39;ve been out of touch with C/C++ for a<br>
&gt;&gt; &gt;     while.<br>
&gt;&gt; &gt;      &gt;<br>
&gt;&gt; &gt;      &gt;Thanks!<br>
&gt;&gt; &gt;      &gt;Hai<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; --<br>
&gt;&gt; ---------------------------------------------------------------------------<br>
&gt;&gt; Jeff Newmiller                        The     .....       .....  Go Live...<br>
&gt;&gt; DCN:&lt;<a href="mailto:jdnewmil@dcn.davis.ca.us">jdnewmil@dcn.davis.ca.us</a>&gt;        Basics: ##.#.       ##.#.  Live<br>
&gt;&gt; Go...<br>
&gt;&gt;                                       Live:   OO#.. Dead: OO#..  Playing<br>
&gt;&gt; Research Engineer (Solar/Batteries            O.O#.       #.O#.  with<br>
&gt;&gt; /Software/Embedded Controllers)               .OO#.       .OO#.  rocks...1k<br>
&gt;&gt; ---------------------------------------------------------------------------<br>
&gt;&gt; _______________________________________________<br>
&gt;&gt; vox-tech mailing list<br>
&gt;&gt; <a href="mailto:vox-tech@lists.lugod.org">vox-tech@lists.lugod.org</a><br>
&gt;&gt; <a href="http://lists.lugod.org/mailman/listinfo/vox-tech" target="_blank">http://lists.lugod.org/mailman/listinfo/vox-tech</a><br>
&gt;&gt;<br>
&gt;_______________________________________________<br>
&gt;vox-tech mailing list<br>
&gt;<a href="mailto:vox-tech@lists.lugod.org">vox-tech@lists.lugod.org</a><br>
&gt;<a href="http://lists.lugod.org/mailman/listinfo/vox-tech" target="_blank">http://lists.lugod.org/mailman/listinfo/vox-tech</a><br>
<br>
---------------------------------------------------------------------------<br>
Jeff Newmiller                        The     .....       .....  Go Live...<br>
DCN:&lt;<a href="mailto:jdnewmil@dcn.davis.ca.us">jdnewmil@dcn.davis.ca.us</a>&gt;        Basics: ##.#.       ##.#.  Live Go...<br>
                                      Live:   OO#.. Dead: OO#..  Playing<br>
Research Engineer (Solar/Batteries            O.O#.       #.O#.  with<br>
/Software/Embedded Controllers)               .OO#.       .OO#.  rocks...1k<br>
---------------------------------------------------------------------------<br>
</div></div><div class="im">Sent from my phone. Please excuse my brevity.<br>
_______________________________________________<br>
</div><div><div></div><div class="h5">vox-tech mailing list<br>
<a href="mailto:vox-tech@lists.lugod.org">vox-tech@lists.lugod.org</a><br>
<a href="http://lists.lugod.org/mailman/listinfo/vox-tech" target="_blank">http://lists.lugod.org/mailman/listinfo/vox-tech</a><br>
</div></div></blockquote></div><br>