During the compilation you face this issue:
make[2]: Entering directory '/home/alan/nuttxspace/apps/examples/helloxx' CXX: helloxx_main.cxx In file included from /usr/include/newlib/c++/4.9.3/bits/char_traits.h:380:0, from /usr/include/newlib/c++/4.9.3/string:40, from helloxx_main.cxx:42: /home/alan/nuttxspace/nuttx/include/cxx/cstdint:75:11: error: 'uint_least32_t' is already declared in this scope using ::uint_least32_t; ^ /home/alan/nuttxspace/apps/Application.mk:85: recipe for target 'helloxx_main.o' failed make[2]: *** [helloxx_main.o] Error 1 make[2]: Leaving directory '/home/alan/nuttxspace/apps/examples/helloxx' Makefile:92: recipe for target 'examples/helloxx_all' failed make[1]: *** [examples/helloxx_all] Error 2 make[1]: Leaving directory '/home/alan/nuttxspace/apps' LibTargets.mk:174: recipe for target '../apps/libapps.a' failed make: *** [../apps/libapps.a] Error 2
First thing to do is compile in verbose mode (make V=1) :
$ make V=1 ... make[2]: Entering directory '/home/alan/nuttxspace/apps/examples/helloxx' CXX: helloxx_main.cxx arm-none-eabi-g++ -c -fno-builtin -fno-use-cxa-atexit -fcheck-new -specs=nano.specs -lstdc++ -lsupc++ -lm -lgcc -lc -lnosys -std=gnu++11 -Wall -Wshadow -Wundef -g -mcpu=cortex-m4 -mthumb -mfloat-abi=soft -I. -isystem /home/alan/nuttxspace/nuttx/include -isystem /home/alan/nuttxspace/nuttx/include/cxx -pipe -I "/home/alan/nuttxspace/apps/include" helloxx_main.cxx -o helloxx_main.o In file included from /usr/include/newlib/c++/4.9.3/bits/char_traits.h:380:0, from /usr/include/newlib/c++/4.9.3/string:40, from helloxx_main.cxx:42: /home/alan/nuttxspace/nuttx/include/cxx/cstdint:75:11: error: 'uint_least32_t' is already declared in this scope using ::uint_least32_t; ^ /home/alan/nuttxspace/apps/Application.mk:85: recipe for target 'helloxx_main.o' failed make[2]: *** [helloxx_main.o] Error 1 make[2]: Leaving directory '/home/alan/nuttxspace/apps/examples/helloxx' Makefile:92: recipe for target 'examples/helloxx_all' failed make[1]: *** [examples/helloxx_all] Error 2 make[1]: Leaving directory '/home/alan/nuttxspace/apps' LibTargets.mk:174: recipe for target '../apps/libapps.a' failed make: *** [../apps/libapps.a] Error 2
Copy the above g++ command line:
arm-none-eabi-g++ -c -fno-builtin -fno-use-cxa-atexit -fcheck-new -specs=nano.specs -lstdc++ -lsupc++ -lm -lgcc -lc -lnosys -std=gnu++11 -Wall -Wshadow -Wundef -g -mcpu=cortex-m4 -mthumb -mfloat-abi=soft -I. -isystem /home/alan/nuttxspace/nuttx/include -isystem /home/alan/nuttxspace/nuttx/include/cxx -pipe -I "/home/alan/nuttxspace/apps/include" helloxx_main.cxx -o helloxx_main.o
Enter inside the directory where the issue happened:
$ cd ../apps/examples/helloxx/
Paste the g++ line we copied and add “-save-temps” to it:
alan@pc:~/nuttxspace/apps/examples/helloxx$ arm-none-eabi-g++ -c -fno-builtin -fno-use-cxa-atexit -fcheck-new -specs=nano.specs -lstdc++ -lsupc++ -lm -lgcc -lc -lnosys -std=gnu++11 -Wall -Wshadow -Wundef -g -mcpu=cortex-m4 -mthumb -mfloat-abi=soft -I. -isystem /home/alan/nuttxspace/nuttx/include -isystem /home/alan/nuttxspace/nuttx/include/cxx -pipe -I "/home/alan/nuttxspace/apps/include" helloxx_main.cxx -o helloxx_main.o -save-temps arm-none-eabi-g++: warning: -pipe ignored because -save-temps specified In file included from /usr/include/newlib/c++/4.9.3/string:40:0, from helloxx_main.cxx:42: /usr/include/newlib/c++/4.9.3/bits/char_traits.h:63:20: error: 'mbstate_t' in namespace 'std' does not name a type typedef std::mbstate_t state_type; ^ In file included from /usr/include/newlib/c++/4.9.3/bits/char_traits.h:380:0, from /usr/include/newlib/c++/4.9.3/string:40, from helloxx_main.cxx:42: /home/alan/nuttxspace/nuttx/include/cxx/cstdint:75:11: error: 'uint_least32_t' is already declared in this scope using ::uint_least32_t; ^
Confirm the .ii file was created:
$ ls *.ii helloxx_main.ii
Open it:
$ vi helloxx_main.ii
Analyzing it we found:
# 42 "/usr/include/newlib/c++/4.9.3/type_traits" 3 namespace std { typedef short unsigned int uint_least16_t; typedef long unsigned int uint_least32_t; } # 219 "/home/alan/nuttxspace/nuttx/include/stdint.h" 3 4 ... typedef _uint32_t uint_least32_t; # 63 "/usr/include/newlib/machine/_default_types.h" 3 4 ... typedef long unsigned int __uint32_t;
Good, now we know the places where uint_least32_t was re-defined.
Thanks Greg Nutt for this tip!