Page 1 of 1

C++ set-up question

Posted: Thu Nov 09, 2017 11:12 am
by _Phil_
Hi all,

I'm just starting to dig into ESP-IDF and I need to port some C++ classes over from my old Arduino platform, but I've hit what I suspect is a really stupid problem on my part.

I've been though the details in the following post https://esp32.com/viewtopic.php?t=362 and I've also got a copy of Neil Kolban's ESP32 book which I'm using as a guide for C++ integration.

Here's how I've got to this point.

Created a new proeject based on the details in Neils book by git'ing the esp-idf-template and ran make menuconfig and make - which results in a clean compile.

Added the triangle cpp and h files from bengchet's zip into the main directory

Added '

Code: Select all

COMPONENT_ADD_LDFLAGS=-lstdc++ -l$(COMPONENT_NAME)
' to the component.mk in the same dir.

Compile works fine.

Replaced main.c with bengchet's fixed code from the forum post and it blows chunks.

______________________________________________________
CC build/main/main.o
In file included from C:/msys32/home/Phil/esp/myapp/main/main.c:8:0:
C:/msys32/home/Phil/esp/myapp/main/triangle.h:11:1: error: unknown type name 'class'
class Triangle{
^
C:/msys32/home/Phil/esp/myapp/main/triangle.h:11:15: error: expected '=', ',', ';', 'asm' or '__attribute__' before '{' token
class Triangle{
^
C:/msys32/home/Phil/esp/myapp/main/main.c:10:1: error: unknown type name 'Triangle'
Triangle polygon(3, 4, 5); //<--- example class
^
C:/msys32/home/Phil/esp/myapp/main/main.c:10:18: error: expected declaration specifiers or '...' before numeric constant
Triangle polygon(3, 4, 5); //<--- example class
^
C:/msys32/home/Phil/esp/myapp/main/main.c:10:21: error: expected declaration specifiers or '...' before numeric constant
Triangle polygon(3, 4, 5); //<--- example class
^
C:/msys32/home/Phil/esp/myapp/main/main.c:10:24: error: expected declaration specifiers or '...' before numeric constant
Triangle polygon(3, 4, 5); //<--- example class
^
C:/msys32/home/Phil/esp/myapp/main/main.c:17:8: error: expected identifier or '(' before string constant
extern "C" int app_main(void)
^
make[1]: *** [/home/Phil/esp/esp-idf/make/component_wrapper.mk:243: main.o] Error 1
make: *** [C:/msys32/home/Phil/esp/esp-idf/make/project.mk:435: component-main-build] Error 2

______________________________________________________

I've also had the same issues when I use Neil's MyClass C++ example from his book (fixing the myStaticFunc issue) with a fresh esp-idf-templated app, it seems to fail with the class definition the same as with the triangle class.

Halp!

Re: C++ set-up question

Posted: Fri Nov 10, 2017 5:56 am
by kolban
Howdy,
Welcome to the forum and the community. There are tons of great folks here to assist.

Thankfully, I think this problem might be quite easy (that isn't normally the case).

If you source code is C++ then the file extension (suffix) must be ".cpp". My recommendation is to rename your "main.c" file to be "main.cpp" and then delete the "build" directory and recompile. While one shouldn't need to delete the build directory, it does no harm as all will be rebuilt ... however, ive seen "strangeness" when one changes the file suffix of a file that was previously compiled. Try this and post back with the results.

Re: C++ set-up question

Posted: Fri Nov 10, 2017 10:23 am
by f.h-f.s.
Doesn't have to be cpp. see this discussion: https://stackoverflow.com/questions/154 ... -cc-vs-cpp
The hint in the error would be "CC build/main/main.o" CC means gcc was used, not "xtensa-esp32-elf-g++".
When you change your main to cpp you will see it compile as "CXX build/main/main.o"

Re: C++ set-up question

Posted: Fri Nov 10, 2017 10:46 am
by _Phil_
Hi all,

Yep, it was my stupid error (hides in shame self flagelating).

Following the details I posted above, with Neil's suggestion to remove the build/ dir, and just renaming main.c to main.cc it compiled fine (after taking out the wifi code as it was throwing errors with the sprintf).

Here's the start of the compile showing it's picking up the right compiler now.

Code: Select all

$ make
CXX build/main/main.o
CXX build/main/triangle.o
Thanks guys.