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
[email protected]
Twitter: http://twitter.com/#!/fraviofii
LinkedIn profile: www.linkedin.com/in/flaviocastroalves