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

Reply via email to