Hello, I am trying to use STL in a simple C++ Hello project and I am getting compilation error.s
Is STL supported in NuttX? Can I use it? Here is my sample code: === Hello.cpp === #include <stdio.h> #include "HelloWorld.h" CHelloWorld::CHelloWorld() { mSecret = 42; printf("Constructor: mSecret=%d\n",mSecret); } CHelloWorld::~CHelloWorld() { } bool CHelloWorld::HelloWorld(void) { printf("HelloWorld: mSecret=%d\n",mSecret); if (mSecret == 42) { printf("CHelloWorld: HelloWorld: Hello, world!"); return true; } else { printf("CHelloWorld: HelloWorld: CONSTRUCTION FAILED!\n"); return false; } } ========= === Hello.h === class CHelloWorld { public: CHelloWorld(); ~CHelloWorld(); bool HelloWorld(void); private: int mSecret; }; ========= === Log.cpp === #include "Log.h" #include <stdio.h> #include <string> void Log::print(std::string_view message) { FILE *fp = fopen("/dev/ttyS0", "w"); if (fp == NULL) { printf("Error opening serial port!\n"); return; } std::string msgStr { message }; /* Try to force input data on stdin */ fwrite(msgStr.c_str(), sizeof(char), message.length(), fp); fclose(fp); } ========= === Log.h === #include <string_view> class Log { public: static void print(std::string_view message); }; ========= And there the compilation error: ========= -- Build files have been written to: /home/ubuntu/nuttx-apps/hellocpp/build [4/4] Linking CXX executable src/hellocpp FAILED: src/hellocpp : && arm-none-eabi-ld --entry=__start -nostartfiles -nostdlib -nodefaultlibs -T/home/ubuntu/nuttx-apps/hellocpp/nuttx-export-9.1.0/scripts/ld.script -o hellocpp.elf src/CMakeFiles/hellocpp.dir/HelloWorld.cpp.o src/CMakeFiles/hellocpp.dir/Log.cpp.o src/CMakeFiles/hellocpp.dir/main.cpp.o -L/home/ubuntu/nuttx-apps/hellocpp/src/hellocpp -L/home/ubuntu/nuttx-apps/hellocpp/nuttx-export-9.1.0/libs --start-group -lc -larch -lbinfmt -lboard -lboards -ldrivers -lfs -lmm -lsched -lxx -lnet -lsupc++ /usr/lib/gcc/arm-none-eabi/9.2.1/thumb/v7e-m/nofp/libgcc.a --end-group && cd /home/ubuntu/nuttx-apps/hellocpp/build/src && arm-none-eabi-objcopy -S -O binary /home/ubuntu/nuttx-apps/hellocpp/build/hellocpp.elf /home/ubuntu/nuttx-apps/hellocpp/build/hellocpp.bin arm-none-eabi-ld: src/CMakeFiles/hellocpp.dir/Log.cpp.o: in function `void std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_construct<char const*>(char const*, char const*, std::forward_iterator_tag)': /usr/include/newlib/c++/9.2.1/bits/basic_string.tcc:212: undefined reference to `std::__throw_logic_error(char const*)' arm-none-eabi-ld: /usr/include/newlib/c++/9.2.1/bits/basic_string.tcc:219: undefined reference to `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_create(unsigned int&, unsigned int)' arm-none-eabi-ld: /usr/include/newlib/c++/9.2.1/bits/basic_string.tcc:225: undefined reference to `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_S_copy_chars(char*, char const*, char const*)' arm-none-eabi-ld: src/CMakeFiles/hellocpp.dir/Log.cpp.o: in function `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string()': /usr/include/newlib/c++/9.2.1/bits/basic_string.h:658: undefined reference to `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_dispose()' arm-none-eabi-ld: /usr/include/newlib/c++/9.2.1/bits/basic_string.h:658: undefined reference to `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_dispose()' ninja: build stopped: subcommand failed. make[1]: *** [Makefile:13: _build] Error 1 make[1]: Leaving directory '/home/ubuntu/nuttx-apps/hellocpp' make: *** [Makefile:25: default] Error 2 ========= My CMakelists: === CMakeLists.txt === cmake_minimum_required(VERSION 3.2...3.15) project(hellocpp VERSION 1.0 DESCRIPTION "Hello world C++ Nuttx" ) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_C_STANDARD 99) set(NUTTX_PATH "${CMAKE_SOURCE_DIR}/nuttx-export-9.1.0") include(cmake/phigw.cmake) set(AC_COMMON_FLAGS "${AC_COMMON_FLAGS} -fno-builtin -Wall -Wshadow -Wundef -g") set(AC_DEFINES "${AC_DEFINES} -DCONFIG_WCHAR_BUILTIN") include_directories( src ${NUTTX_PATH}/include ${NUTTX_PATH}/arch/chip ) set(EXE_NAME hellocpp) set(CMAKE_CXX_FLAGS "${AC_HW_FLAGS} ${AC_DEFINES} ${AC_COMMON_FLAGS} ${AC_CXX_EXTRA_FLAGS}") if (PARAM_DEBUG) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Os -g") else() set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Os") endif() set(CMAKE_SKIP_RPATH ON) set(CMAKE_CXX_LINK_EXECUTABLE "${CMAKE_LINKER} ${AC_LINKER_FLAGS} -o ${EXE_NAME}.elf <OBJECTS> <LINK_LIBRARIES>") set(BUILD_SHARED_LIBS OFF) add_subdirectory(src) ========= === src/CMakelists.txt === set(HEADER_FILES HelloWorld.h Log.h ) set(SOURCE_FILES HelloWorld.cpp Log.cpp ) link_directories(${EXE_NAME} ${NUTTX_PATH}/libs) add_executable(${EXE_NAME} ${SOURCE_FILES} main.cpp ${HEADER_FILES}) add_custom_command( TARGET ${EXE_NAME} POST_BUILD COMMAND ${CMAKE_OBJCOPY} ARGS -S -O binary ${CMAKE_BINARY_DIR}/${EXE_NAME}.elf ${CMAKE_BINARY_DIR}/${EXE_NAME}.bin ) target_link_libraries(${EXE_NAME} --start-group) target_link_libraries(${EXE_NAME} c) target_link_libraries(${EXE_NAME} arch) target_link_libraries(${EXE_NAME} binfmt) target_link_libraries(${EXE_NAME} board) target_link_libraries(${EXE_NAME} boards) target_link_libraries(${EXE_NAME} drivers) target_link_libraries(${EXE_NAME} fs) target_link_libraries(${EXE_NAME} mm) target_link_libraries(${EXE_NAME} sched) target_link_libraries(${EXE_NAME} xx) target_link_libraries(${EXE_NAME} net) target_link_libraries(${EXE_NAME} supc++) target_link_libraries(${EXE_NAME} /usr/lib/gcc/arm-none-eabi/9.2.1/thumb/v7e-m/nofp/libgcc.a) target_link_libraries(${EXE_NAME} --end-group) ========= I am using Ubuntu 20.04 operating system and the toolchain provided from the Ubuntu Repository. Best regards, Flavio -- Flavio de Castro Alves Filho flavio.al...@gmail.com Twitter: http://twitter.com/#!/fraviofii LinkedIn profile: www.linkedin.com/in/flaviocastroalves