[MPlayer-dev-eng] c++ and libmpcodec

Shachar Raindel shacharr at gmail.com
Mon Sep 12 23:48:16 CEST 2005


On 9/12/05, Miroslav Shaltev <Miroslav.Shaltev at stud.uni-hannover.de> wrote:
> hi @ all,
> 
> i hope i post my quesion to the right place, if not so, please sorry (and ban
> me to the right list -> tnx).
> 
> the problem:
> 
> i try to add a decoderlib to libmpcodecs. however the decoderlib is written in
> c++ (?!) , so i can not simply include the headers and rest in a simple
> vd_mylib.c file. therefor i add vd_mylib.cpp , change the Makefile. Running
> make in libmpcodecs is ok, but make ontop ends with
> 
> g++ -I../libvo -I../../libvo -I/usr/X11R6/include -fno-PIC -O4 -march=athlon-4
> -mcpu=athlon-4 -pipe -ffast-math -fomit-frame-pointer  -I.
> -I/usr/include/freetype2   -I/usr/include/SDL  -I/usr/X11R6/include       -o
> mplayer mplayer.o mp_msg.o cpudetect.o codec-cfg.o spudec.o playtree.o
> playtreeparser.o asxparser.o vobsub.o subreader.o sub_cc.o find_sub.o
> m_config.o m_option.o parser-cfg.o m_struct.o edl.o unrarlib.o mixer.o
> parser-mpcmd.o subopt-helper.o libvo/libvo.a libao2/libao2.a
> vidix/libvidix.a  libmpcodecs/libmpcodecs.a loader/libloader.a
> loader/dshow/libDS_Filter.a loader/dmo/libDMO_Filter.a libaf/libaf.a
> libmpdemux/libmpdemux.a input/libinput.a postproc/libswscale.a
> osdep/libosdep.a -Llibmpdvdkit2 -lmpdvdkit libavcodec/libavcodec.a   -lmad
> -lstdc++ -llzo -ldivxdecore   -lxvidcore -lm  -lpng -lz -lz -ljpeg -lasound
> -ldl -lpthread   -lfreetype -lz  -lcdda_interface -lcdda_paranoia -lnsl
> -lgif  -lsmbclient  -lfontconfig    libfaad2/libfaad2.a  mp3lib/libMP3.a
> liba52/liba52.a libmpeg2/libmpeg2.a tremor/libvorbisidec.a  -laa -lGL
> -lXxf86dga -lXv  -lXxf86vm -lXinerama -L/usr/X11R6/lib -lXext -lX11 -lnsl
> -lnsl -L/usr/lib -Wl,-rpath,/usr/lib -lSDL -lpthread    -lvgagl -lvga -lm
> -L/usr/kde/3.4/lib -ldl -lartsc -lpthread -lgmodule-2.0 -ldl -lgthread-2.0
> -lglib-2.0 -L/usr/lib -lesd -laudiofile -lm -lasound -lbio2jack -ljack
> -lpthread -ldl -rdynamic   -lm
> libmpcodecs/libmpcodecs.a(vd_mylib.o)(.text+0x23): In function `init':
> : undefined reference to `showmsg'
> collect2: ld returned 1 exit status
> make: *** [mplayer] Error 1
> 
> showmsg  is just a test funktion in my cpp file i try to "see" from
> vd_mylib.c. i think the problem is in the way c++ handles function naming, or
> so, there are in general visability problems between c / c++. in a simple two
> file project, i can use c++ funktions in c program, the same syntax do not
> works in mplayer, and i have really no idea why. for any suggestions many
> many tnx.
> 
> regards,
> miroslav
> 

In your header file you declared a C function, named showmsg. In your
C++ implementation file, you declared a C++ function (meaning, the
function name gets mangled, in order to allow overloading) with the
same name. This is *not* the same function. Try surrounding the
function in vd_mylib.cpp with extern "C" { ... } just like what you
did in your header file, and compile again (no need for the #ifdef
__cplusplus )

    Shachar

> p.s. some code
> 
> in
> vd_mylib.c
> 
> #include "vd_mylib_link.h"
> 
> static int init(sh_video_t *sh){
>         showmsg("I told you, you will see how stupied c++ can be!!!");
>         return mpcodecs_config_vo(sh,sh->disp_w,sh->disp_h,IMGFMT_YV12);
> }
> 
> in
> vd_mylib_link.h
> 
> #ifdef __cplusplus
>  extern "C" {
>  #endif
> 
> int showmsg(const char *fStr);
> 
> #ifdef __cplusplus
>  }
>  #endif
> 
> in
> vd_mylib.cpp


<<<<< Try adding here:
+extern "C" {
<<<<<

> int showmsg(const char *fStr){
>         std::cout << fStr << std::endl;
>         return 0;
> }

<<<<< And adding here:
+}
<<<<<




More information about the MPlayer-dev-eng mailing list