Open haffmans opened 3 years ago
Turns out the final executable needs to be built with the -fno-rtti
flag enabled to work around this.
I think it makes sense to add this to the CXX_Flags in the shipped toolchain file (tools/cmake/toolchain-esp32.cmake
), but adding it to a custom toolchain file works too:
set(CMAKE_SYSTEM_NAME Generic)
set(CMAKE_C_COMPILER xtensa-esp32-elf-gcc)
set(CMAKE_CXX_COMPILER xtensa-esp32-elf-g++)
set(CMAKE_ASM_COMPILER xtensa-esp32-elf-gcc)
set(CMAKE_C_FLAGS "-mlongcalls -Wno-frame-address" CACHE STRING "C Compiler Base Flags")
set(CMAKE_CXX_FLAGS "-mlongcalls -Wno-frame-address -fno-rtti" CACHE STRING "C++ Compiler Base Flags")
Another alternative work-around is adding it to the interface compile options of the __idf_asio
target:
target_compile_options(__idf_asio INTERFACE -fno-rtti)
Hi @haffmans
Thanks for making us aware of this problem on passing a configuration to the components and the project when building using custom CMake.
As for the asio
, it could be build with rtti
both on
and off
. Let me add some more to the list of your workarounds:
target_compile_options(${CMAKE_PROJECT_NAME}.elf PRIVATE -fno-rtti)
target_compile_definitions(__idf_asio PRIVATE CONFIG_COMPILER_RTTI=1)
We could also check directly if the compiler's rtti is enabled in asio:
diff --git a/components/asio/port/include/esp_asio_config.h b/components/asio/port/include/esp_asio_config.h
index cba316527e..ebff60c806 100644
--- a/components/asio/port/include/esp_asio_config.h
+++ b/components/asio/port/include/esp_asio_config.h
@@ -14,9 +14,9 @@
# define ASIO_NO_EXCEPTIONS
# endif // CONFIG_COMPILER_CXX_EXCEPTIONS
-# ifndef CONFIG_COMPILER_RTTI
+# ifndef __GXX_RTTI
# define ASIO_NO_TYPEID
-# endif // CONFIG_COMPILER_RTTI
+# endif // __GXX_RTTI
//
// LWIP compatibility inet and address macros/functions
Environment
git describe --tags
to find it): v4.3-dev-2940-g6e776946dxtensa-esp32-elf-gcc --version
to find it): xtensa-esp32-elf-gcc (crosstool-NG esp-2020r3) 8.4.0Problem Description
Trying to use the asio component in a custom CMake project fails to compile in multiple ways. This can be reproduced by adapting the protocols/asio/tcp_echo_server example to follow the custom CMake approach (but it also occurs with real projects using asio).
The first issue is that the
ESP_PLATFORM
definition is required when includingasio.hpp
, otherwise the wrong asio config is loaded (specifically, ESP's configuration is not included). It would be helpful if ESP_PLATFORM is either added asPUBLIC
definition on theidf::asio
CMake target (or actually__idf_asio
):After this, compilation works until the linking stage fails with the following error that I haven't been able to resolve yet (full output below):
The exact same program code works when using idf.py to build the example. Given that the compile stage works
Expected Behavior
The asio component is usable from custom CMake projects.
Actual Behavior
Compilation and linking fails.
Steps to reproduce
Code to reproduce this issue
Debug Logs
Complete log attached. output.log
Other items if possible
N/A