C++ Usage Issues - Problems, Solutions, and Suggestions

Joel Sherrill joel.sherrill at oarcorp.com
Thu Jun 21 14:34:54 UTC 2007


So you don't have to page to the bottom..

+ I think the CONFIGURE_TEST_XXX uses should be
fixed now.  Or at least confdefs.h will give an error that
they are obsolete.  I got bit by this one on some code myself.

+ Please send a patch for everything you changed.  I don't
care about the .c->.cc changes but the ones that improve
the correctness of the code are VERY important.

+ I obviously need to add the network demos to the automated
build sweep.  When networking is configured, I should at least
compile all demos with the loopback driver configured.

--joel

Robert S. Grimes wrote:
> Hello,
>
> I'm using RTEMS to develop a three processor system, and I'd like to use
> C++ for my application development; not trying to get too fancy, but I
> do like some of the "better C" type features of C++.  Anyway, I decided
> to see what needs to be changed to make a simple C application compile,
> link, and of course, run when built as a C++ application.
>
> <WARNING>This email is rather long and tedious, and does not represent a
> pressing problem.  For those too busy, feel free to exit now.  Or if you
> just want the summary, skip ahead to SUMMARY, as there are two
> conclusions that I (finally) make!</WARNING>
>
> So, I simply copied the netdemo program  from the networking demos,
> renamed the .c files to .cc, and changed the C_PIECES to CC_PIECES in th
> Makefile.  Next, of course, I modified the networkconfig.h
> appropriately.  Here is what I found.
>
> 1.  First attempt at make:
>
>     $ make
>     powerpc-rtems-g++ -B/usr/rtems/4.8/powerpc-rtems/virtex/lib/ -specs
>     bsp_specs -qrtems   -g -Wall  -g    -mcpu=403 -Dppc4
>     05 -Dvirtex      -c   -o o-optimize/init.o init.cc
>     init.cc:42:22: error: confdefs.h: No such file or directory
>     init.cc: In function 'rtems_task Init(rtems_task_argument)':
>     init.cc:59: error: 'exit' was not declared in this scope
>     make: *** [o-optimize/init.o] Error 1
>
> The first error is a bug from the original init.c, and seems to exist in
> many places in the network demos.  This line
>
>     #include <confdefs.h>
>
> needs to be changed to this:
>
>     #include <rtems/confdefs.h>
>
> The second error is fixed most appropriately by adding to init.cc:
>
>     #include <stdlib.h>
>
> 2. Second attempt at make:
>
>     $ make
>     powerpc-rtems-g++ -B/usr/rtems/4.8/powerpc-rtems/virtex/lib/ -specs
>     bsp_specs -qrtems   -g -Wall  -g    -mcpu=403 -Dppc4
>     05 -Dvirtex      -c   -o o-optimize/init.o init.cc
>     powerpc-rtems-g++ -B/usr/rtems/4.8/powerpc-rtems/virtex/lib/ -specs
>     bsp_specs -qrtems   -g -Wall  -g    -mcpu=403 -Dppc4
>     05 -Dvirtex      -c   -o o-optimize/test.o test.cc
>     test.cc: In function 'void showbroad(int)':
>     test.cc:39: error: invalid conversion from 'int*' to 'socklen_t*'
>     test.cc:39: error:   initializing argument 5 of 'int getsockopt(int,
>     int, int, void*, socklen_t*)'
>     test.cc: In function 'void echoServer(short unsigned int)':
>     test.cc:227: error: invalid conversion from 'int*' to 'socklen_t*'
>     test.cc:227: error:   initializing argument 3 of 'int accept(int,
>     sockaddr*, socklen_t*)'
>     make: *** [o-optimize/test.o] Error 1
>
> This is fixed by changing the definitions of optlen and addrlen from int
> to socklen_t, and a few typecasts when they are used as integers.
>
> 3. Third attempt at make:
>
>     $ make
>     powerpc-rtems-g++ -B/usr/rtems/4.8/powerpc-rtems/virtex/lib/ -specs
>     bsp_specs -qrtems   -g -Wall  -g    -mcpu=403 -Dppc4
>     05 -Dvirtex      -c   -o o-optimize/init.o init.cc
>     powerpc-rtems-gcc --pipe -B/usr/rtems/4.8/powerpc-rtems/virtex/lib/
>     -specs bsp_specs -qrtems   -g -Wall  -O4 -fno-keep-i
>     nline-functions -g -g      -mcpu=403 -Dppc405 -Dvirtex         -o
>     o-optimize/netdemo.exe   o-optimize/init.o o-optimize/
>     test.o  /usr/rtems/4.8/powerpc-rtems/virtex/lib/no-dpmem.rel
>     /usr/rtems/4.8/powerpc-rtems/virtex/lib/no-msg.rel /usr/rte
>     ms/4.8/powerpc-rtems/virtex/lib/no-mp.rel
>     /usr/rtems/4.8/powerpc-rtems/virtex/lib/no-part.rel
>     /usr/rtems/4.8/powerpc-rte
>     ms/virtex/lib/no-signal.rel
>     /usr/rtems/4.8/powerpc-rtems/virtex/lib/no-timer.rel
>     /usr/rtems/4.8/powerpc-rtems/virtex/lib
>     /no-rtmon.rel
>     o-optimize/init.o:(.eh_frame+0x11): undefined reference to
>     `__gxx_personality_v0'
>     o-optimize/test.o: In function `showStatistics':
>     /cygdrive/c/Home/ll/etill/development/apps/experiments/network-demos-4.7.99.1/netdemo-cc/test.cc:49:
>     undefined reference
>      to `rtems_bsdnet_show_inet_routes()'
>     /cygdrive/c/Home/ll/etill/development/apps/experiments/network-demos-4.7.99.1/netdemo-cc/test.cc:50:
>     undefined reference
>      to `rtems_bsdnet_show_mbuf_stats()'
>     /cygdrive/c/Home/ll/etill/development/apps/experiments/network-demos-4.7.99.1/netdemo-cc/test.cc:51:
>     undefined reference
>      to `rtems_bsdnet_show_if_stats()'
>     /cygdrive/c/Home/ll/etill/development/apps/experiments/network-demos-4.7.99.1/netdemo-cc/test.cc:52:
>     undefined reference
>      to `rtems_bsdnet_show_ip_stats()'
>     /cygdrive/c/Home/ll/etill/development/apps/experiments/network-demos-4.7.99.1/netdemo-cc/test.cc:53:
>     undefined reference
>      to `rtems_bsdnet_show_icmp_stats()'
>     /cygdrive/c/Home/ll/etill/development/apps/experiments/network-demos-4.7.99.1/netdemo-cc/test.cc:54:
>     undefined reference
>      to `rtems_bsdnet_show_udp_stats()'
>     /cygdrive/c/Home/ll/etill/development/apps/experiments/network-demos-4.7.99.1/netdemo-cc/test.cc:55:
>     undefined reference
>      to `rtems_bsdnet_show_tcp_stats()'
>     o-optimize/test.o:(.eh_frame+0x11): undefined reference to
>     `__gxx_personality_v0'
>     collect2: ld returned 1 exit status
>     make: *** [o-optimize/netdemo.exe] Error 1
>
> There are really only two problems here.  First, the
> __gxx_personality_v0 error (apparently) comes from a missing C++
> library, and is fixed by adding -lstdc++ to LD_LIBS in the Makefile:
>
>     LD_LIBS   += -lstdc++
>
> The other errors are due to the rtems/rtems_bsdnet.h header file, and
> can be eliminated by changing the inclusion of this file like this:
>
>     extern "C" {
>     #include <rtems/rtems_bsdnet.h>
>     }
>
> 4. Fourth attempt at make - success!
>
>     $ make
>     powerpc-rtems-g++ -B/usr/rtems/4.8/powerpc-rtems/virtex/lib/ -specs
>     bsp_specs -qrtems   -g -Wall  -g    -mcpu=403 -Dppc4
>     05 -Dvirtex      -c   -o o-optimize/test.o test.cc
>     powerpc-rtems-gcc --pipe -B/usr/rtems/4.8/powerpc-rtems/virtex/lib/
>     -specs bsp_specs -qrtems   -g -Wall  -O4 -fno-keep-i
>     nline-functions -g -g      -mcpu=403 -Dppc405 -Dvirtex         -o
>     o-optimize/netdemo.exe   o-optimize/init.o o-optimize/
>     test.o  /usr/rtems/4.8/powerpc-rtems/virtex/lib/no-dpmem.rel
>     /usr/rtems/4.8/powerpc-rtems/virtex/lib/no-msg.rel /usr/rte
>     ms/4.8/powerpc-rtems/virtex/lib/no-mp.rel
>     /usr/rtems/4.8/powerpc-rtems/virtex/lib/no-part.rel
>     /usr/rtems/4.8/powerpc-rte
>     ms/virtex/lib/no-signal.rel
>     /usr/rtems/4.8/powerpc-rtems/virtex/lib/no-timer.rel
>     /usr/rtems/4.8/powerpc-rtems/virtex/lib
>     /no-rtmon.rel -lstdc++
>     powerpc-rtems-objcopy -O srec o-optimize/netdemo.exe
>     o-optimize/netdemo.srec
>     powerpc-rtems-nm -g -n o-optimize/netdemo.exe > o-optimize/netdemo.num
>     powerpc-rtems-size o-optimize/netdemo.exe
>        text    data     bss     dec     hex filename
>      413052   12048   61308  486408   76c08 o-optimize/netdemo.exe
>
> However, this application doesn't work!  Here is the output on the console:
>
>     Exception handling initialization done
>     opb_intc_init: mask = 0x7
>     rtems_glue: Waiting for time
>
> This is because, in init.cc, there are these obsolete lines:
>
>     #define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
>     #define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
>
> Changing them to this fixes the problem:
>
>     #define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
>     #define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
>
> Note - the fact that we got any output at all without the console driver
> is just a happy accident with the virtex BSP.
>
> 5. Fifth attempt - working application!!!  Clean make output:
>
>     $ make
>     test -d o-optimize || mkdir o-optimize
>     powerpc-rtems-g++ -B/usr/rtems/4.8/powerpc-rtems/virtex/lib/ -specs
>     bsp_specs -qrtems   -g -Wall  -g    -mcpu=403 -Dppc4
>     05 -Dvirtex      -c   -o o-optimize/init.o init.cc
>     powerpc-rtems-g++ -B/usr/rtems/4.8/powerpc-rtems/virtex/lib/ -specs
>     bsp_specs -qrtems   -g -Wall  -g    -mcpu=403 -Dppc4
>     05 -Dvirtex      -c   -o o-optimize/test.o test.cc
>     powerpc-rtems-gcc --pipe -B/usr/rtems/4.8/powerpc-rtems/virtex/lib/
>     -specs bsp_specs -qrtems   -g -Wall  -O4 -fno-keep-i
>     nline-functions -g -g      -mcpu=403 -Dppc405 -Dvirtex         -o
>     o-optimize/netdemo.exe   o-optimize/init.o o-optimize/
>     test.o  /usr/rtems/4.8/powerpc-rtems/virtex/lib/no-dpmem.rel
>     /usr/rtems/4.8/powerpc-rtems/virtex/lib/no-msg.rel /usr/rte
>     ms/4.8/powerpc-rtems/virtex/lib/no-mp.rel
>     /usr/rtems/4.8/powerpc-rtems/virtex/lib/no-part.rel
>     /usr/rtems/4.8/powerpc-rte
>     ms/virtex/lib/no-signal.rel
>     /usr/rtems/4.8/powerpc-rtems/virtex/lib/no-timer.rel
>     /usr/rtems/4.8/powerpc-rtems/virtex/lib
>     /no-rtmon.rel -lstdc++
>     powerpc-rtems-objcopy -O srec o-optimize/netdemo.exe
>     o-optimize/netdemo.srec
>     powerpc-rtems-nm -g -n o-optimize/netdemo.exe > o-optimize/netdemo.num
>     powerpc-rtems-size o-optimize/netdemo.exe
>        text    data     bss     dec     hex filename
>      415228   12100   61292  488620   774ac o-optimize/netdemo.exe
>
> Console output:
>
>     Exception handling initialization done
>     opb_intc_init: mask = 0x7
>     rtems_glue: Waiting for time
>     rtems_glue: Done waiting for time
>     xiltemac: Creating shared RX/TX threads
>     xiltemac: Initializing driver for 'eth0'
>     xiltemac: base address 0x81200000, intnum 0x00,
>     xiltemacStart, default linkspeed: 84000000
>     xiltemacStart, new linkspeed:     44000000
>     xiltemac: xiltemacStart, ipier: 00007F0E
>     Destination     Gateway/Mask/Hw    Flags     Refs     Use Expire
>     Interface
>     default         192.168.0.27       UGS         0        0      0 eth0
>     192.168.0.0     255.255.255.0      U           0        0      1 eth0
>     192.168.0.27                       UHL         1        0      1 eth0
>     Create socket.
>     Bind socket.
>     Listen.
>     Accept.
>     Create socket.
>     Bind socket.
>     Listen.
>     Accept.
>     u
>     Create socket.
>     Bind socket.
>     Opt:0    Optlen:4
>     Opt:32    Optlen:4
>
> SUMMARY:
>
> Two main problems have been encountered that should definitely be addressed.
>
> 1. The network-demos-4.7.99.1 are horribly out of date, though the good
> news is that the fixes are all minor.  Specifically, there are the easy
> ones (change all "CONFIGURE_TEST_xxx" macros to
> "CONFIGURE_APPLICATION_xxx" and all "#include <confdefs.h>" to "#include
> <rtems/confdefs.h>"), and a few slightly more tedious ones (change some
> int variables to socklen_t).  There may be other issues in the other
> demo applications that exhibit similar problems.
>
> 2. Some header files are not quite ready for C++ compatibility. 
> Specifically, this exercise found one, rtems/rtems_bsdnet.h, that does
> not include appropriate measures.  Having to type this:
>
>     extern "C" {
>     #include <rtems/rtems_bsdnet.h>
>     }
>
> is ugly and just plain wrong.  This header, and others like it, should
> be modified to use the _BEGIN_STD_C and _END_STD_C appropriately to
> encapsulate definitions that the C++ compiler will otherwise mangle. 
> Using these macros are better then simply extern "C" { }  approach too,
> because they seem to handle the std namespace correctly.
>
> I'm willing to help in whatever way seems appropriate.  I certainly
> don't mind reporting other issues as my work progresses.  Please advise
> me as to the best approach to balance being helpful against being a PITA.
>
> Thanks,
> -Bob
> _______________________________________________
> rtems-users mailing list
> rtems-users at rtems.com
> http://rtems.rtems.org/mailman/listinfo/rtems-users
>   




More information about the users mailing list