If I want a C++ project for my KL25Z Freedom board, I select C++ during the project creation:
This creates a gcc C++ project with all the needed settings.
This worked fine until I added a *.c file to my project which had code in it which was not accepted by the C++ compiler. Wait! Should the *.c not be compiled in C mode, as I was used to with other compilers? It turned out that things are different with gcc (or g++) :-(: the *.c files in my project are compiled in C++ mode. So the question is: how to compile in C mode with the ARM g++ compiler?
I was assuming that the ARM g++ compiler will compile the sources based on the file extension:
- *.c as C
- *.cpp and *.cxx as C++
Obviously I was wrong when I wanted to compile a C file, which has non-C++ compliant syntax: it gets compiled by g++ in C++ mode. This can be easily demonstrated with the following example:
As already discovered in this article, an ARM Eclipse C project is using a completely different tool chain (‘nature’).
C projects are using arm-non-eabi-gcc:
While a C++ project is using arm-none-eabi-g++:
So obviously G++ compiles my C file in C++ mode. Searching the internet indeed showed that I was wrong with my assumption that G++ treats *.c as C files. So how to tell g++ it has to compile my C files in C mode?
Searching the gcc man pages finally revealed an interesting an interesting option:
OVERALL OPTIONS -x language Specify explicitly the language for the following input files (rather than choosing a default based on the file name suffix) . This option applies to all following input files until the next `-x' op- tion. Possible values of language are `c', `objec- tive-c', `c-header', `c++', `cpp-output', `assem- bler', and `assembler-with-cpp'. -x none Turn off any specification of a language, so that subsequent files are handled according to their file name suffixes (as they are if `-x' has not been used at all).
I checked the command line generated by Eclipse, but I have not seen that -x option. It seems to me that g++ internally is using the -x option to map the *.c to C++?
Anyway, my solution is to add
to the g++ command line in the project settings:
With this, g++ compiles my *.c in C mode:
Happy C-ing 🙂