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