How to enable C++11/C++0x support in Eclipse CDT?
Asked Answered
C

17

218

Eclipse 3.7.1 CDT 1.4.1 GCC 4.6.2

This is an example of a piece of C++11 code:

auto text = std::unique_ptr<char[]>(new char[len]);

The Eclipse editor complains about:

Function 'unique_ptr' could not be resolved

The Makefile compilation works fine. How to make Eclipse stop complaining about these sort of errors?

Cavuoto answered 3/2, 2012 at 16:13 Comment(8)
At the very least, it should be std::unique_ptr<char[]>Lowering
Not sure that is correct -- char[] is convertible to char* and unique_ptr<char> is a pointer to char, like char*Cavuoto
Wouldn't unique_ptr<char> call delete, which is wrong since it was created with new[]?Chemar
@Nick: No, he's right. The way you wrote it will cause delete to be called, when you need delete[] called. The unique_ptr<char> assumes that it's getting a pointer, which gets deleted with delete. unique_ptr<char[]> expects an array, which gets deleted with delete[] correctly.Coarctate
Related: https://mcmap.net/q/128225/-eclipse-cdt-indexing-and-std-unique_ptr/636019, https://mcmap.net/q/128226/-c-0x-compiles-but-eclipse-editor-errors-even-with-gnu-0x-discovery/636019, https://mcmap.net/q/128227/-build-c-0x-features-with-eclipse/636019, https://mcmap.net/q/128228/-eclipse-indexer-can-39-t-resolve-shared_ptr/636019Meghanmeghann
@ildjarn: Looks like all are the same question, but I think this one is better written.Bestead
10x guys -- I update the code according to the 1st commentCavuoto
Commenters, please know the syntax. unique_ptr<char[]> is a new syntax to evoke delete[].Puttier
G
232

I found this article in the Eclipse forum, just followed those steps and it works for me. I am using Eclipse Indigo 20110615-0604 on Windows with a Cygwin setup.

  • Make a new C++ project
  • Default options for everything
  • Once created, right-click the project and go to "Properties"
  • C/C++ Build -> Settings -> Tool Settings -> GCC C++ Compiler -> Miscellaneous -> Other Flags. Put -std=c++0x (or for newer compiler version -std=c++11 at the end . ... instead of GCC C++ Compiler I have also Cygwin compiler
  • C/C++ General -> Paths and Symbols -> Symbols -> GNU C++. Click "Add..." and paste __GXX_EXPERIMENTAL_CXX0X__ (ensure to append and prepend two underscores) into "Name" and leave "Value" blank.
  • Hit Apply, do whatever it asks you to do, then hit OK.

There is a description of this in the Eclipse FAQ now as well: Eclipse FAQ/C++11 Features.

Eclipse setting

Eclipse image setting

Goldina answered 3/2, 2012 at 20:33 Comment(19)
I have not tried this, but it makes sense. Eclipse CDT uses gcc's scanner and preprocessor.Domestic
Yey, it worked! But, make sure to prepend & append two underscores to GXX_EXPERIMENTAL_CXX0X -- I will accept this in the meantimeCavuoto
Did this remove spurious editor errors? I have no problem with compiling, and new std types are recognised, but I can't get rid of editor syntax errors for range based for loops and rvalue references &&.Jaye
Yeah, when I followed the above settings, then the "red wiggles" were gone, too.Goldina
The natural follow-up question now becomes: can we optimize our workflow by saving these specific C++ Project Settings into a new Eclipse Project template say "C++11 Project"?Mcleod
Does not work for me. Does not accept the c++11 version of vector.insert()Linden
Note: for anyone looking for the answer for Juno, this does not work.Bacchae
can compile and run successfully, but show some error:Methord could not be resolved.Grand
For kepler/juno, the solution is found in this answer. It's posted in the edit to Johan Lundberg's reply below, but I note it here as well, to make the accepted answer more complete.Bloat
@Bacchae works for me, using Juno, and MinGW with gcc/g++ version 4.7Grigson
@Christopher: #10804185 the issue for me was that I was missing the include: /usr/include/c++/4.6/x86_64-linux-gnuProvidence
Also you can change __cplusplus to 201103LDenney
For anybody searching for answer for Luna. This does not work!Zombie
As mentioned above for Kepler/Juno, the following link is confirmed to fix this on Luna: #13635579Outgo
the luna fix link does not suffice on it's own. you have to combine it with the __GXX_EXPERIMENTAL_CXX0X__option from this answer here. at least only that solved my problem, resolving std:stoi :/Boles
I am unable to find c/c++ Build option.In my eclipse in project properties its only showing c/c++ General.What should i do???Bunk
You have to ensure that when your create the project in eclipse it is a C++ project.Goldina
Note, that the "Tool Setting" Tab is only visible when "Generate Makefiles automatically" is enabled. You need to temporarily enable said option in order to set the dialect to C++11.Marlinemarlinespike
For Eclipse 2018-12, only this answer worked for me: https://mcmap.net/q/125274/-how-to-enable-c-11-c-0x-support-in-eclipse-cdtRitchey
Z
153

Instruction For Eclipse CDT 4.4 Luna and 4.5 Mars

First, before creating project, configure Eclipse syntax parser:

Window -> Preferences -> C/C++ -> Build -> Settings -> Discovery -> CDT GCC Build-in Compiler Settings

in the text box entitled Command to get compiler specs append -std=c++11

Now you can create project, configuration depends on what kind of project you created:

For project created as: File -> New -> Project -> C/C++ -> C++ Project

Right click on created project and open

Properties -> C/C++ Build -> Settings -> Tool Settings -> GCC C++ Compiler -> Dialect

Put -std=c++11 into text box entitled other dialect flags or select ISO C++11 from the Language standard drop down.

For CMake project

Generate eclipse project files (inside your project)

mkdir build
cd build
cmake -G"Eclipse CDT4 - Unix Makefiles" -D CMAKE_BUILD_TYPE=Debug ..

Then import generated directory to eclipse as standard eclipse project. Right click project and open

Properties -> C/C++ General -> Preprocessor Include Paths, Marcos etc. -> Providers

enable CDT GCC Build-in Compiler Settings and move it higher than Contributed PathEntry Containers (This is important)

Last Common Step

recompile, regenerate Project ->C/C++ Index and restart Eclipse.

Zombie answered 3/7, 2014 at 19:12 Comment(10)
Worked perfectly even without needing an eclipse restart. Thank you.Mosher
Thank you. No other answer worked for me on Luna too.Kilderkin
Still Works on Mars. More than great answer! If I could only vote up this answer twice!Kilderkin
Thanks! This is the most helpful answer for the issue I've encountered (4.5)Obelisk
Ah! Thank you for the CMake instructions!Dosimeter
thanks, for autotools project, the first step solve the problem.Ergocalciferol
Thanks, the dialect settings fixed it for me!Revenant
Worked on Mars! Thanks!!Cubism
Thanks ! Works on Mars.2 R4.5Panelist
For Eclipse Neon.3, with a C++ Makefile project, the project setting to add -std=c++11 to was Project Properties -> C/C++ General -> Preprocessor Include Paths, Macros etc. -> Providers [tab] -> CDT GCC Built-in Compiler Settings -> Command used to get compiler specs:. Append your -std=c++11 to that. I had it set in the global workspace settings as suggesting, but it wasn't copied into the location I describe above when I created a new Makefile project.Portfire
B
112

Update 2016:

As of gcc 6 (changes), the default C++ dialect is C++14. That means that unless you explicitly need a newer or older dialect than than, you don't need to do anything with eclipse anymore.

For Luna and Mars

This community wiki section incorporates the answer by Trismegistos;

1. Before creating project, configure Eclipse syntax parser:

Window -> Preferences -> C/C++ -> Build -> Settings -> Discovery -> CDT GCC Build-in Compiler Settings

in the text box entitled Command to get compiler specs append -std=c++14 2. Create project, configuration depends on what kind of project you created:

For project created as: File -> New -> Project -> C/C++ -> C++ Project

Right click on created project and open

Properties -> C/C++ Build -> Settings -> Tool Settings -> GCC C++ Compiler -> Dialect

Put -std=c++14 into text box entitled other dialect flags or select ISO C++11 from the Language standard drop down.

There's now a new way to solve this without the GXX_EXPERIMENTAL hack.

For most recent versions: (Currently Juno and Kepler Luna):

Under newer versions of Juno the settings are located at Project properties -> C/C++ General -> Preprocessor Include Paths, Macros etc. -> tab Providers -> CDT GCC Builtin Compiler Settings ().

Older versions 2012/2013:

  1. Under C/C++ Build (at project settings), find the Preprocessor Include Path and go to the Providers Tab. Deselect all except CDT GCC Builtin Compiler Settings. Then untag Share settings entries … . Add the option -std=c++11 to the text box called Command to get compiler specs.

  2. Go to paths and symbols. Under Symbols, click restore defaults, and then apply.


Notes:

Eclipse is picky about hitting apply, you need to do it every time you leave a settings tab.

[Self-promotion]: I wrote my own more detailed instructions based on the above. http://scrupulousabstractions.tumblr.com/post/36441490955/eclipse-mingw-builds

Thanks to the user Nobody at https://mcmap.net/q/128229/-enable-c-11-in-eclipse-cdt-juno-kepler-luna-indexer-duplicate

Biserrate answered 25/11, 2012 at 7:5 Comment(17)
Thank you but it didn't help me to solve c++11 references. Program compiles correctly, but eclipse cannot resolve them. When I check "array", #ifndef __GXX_EXPERIMENTAL_CXX0X__ returns true and code below it is not parsed. When I add __GXX_EXPERIMENTAL_CXX0X__ to project symbols, array gets resolved but my project's references gets messed up. What might be the problem here?About
Not sure what you mean by check array. Did you try to follow the instructions on my blog?Biserrate
Yes I did. In fact, I've just tried it with fresh Eclipse project, it worked. However, with my old project, first it had no effect. When I closed it and re-opened it, std::array is resolved, but then my project references not parsed, as if when I add __GXX_EXPERIMENTAL_CXX0X__ manually. Now I have like 200 unresolved project references. Any thoughts how can I get rid of this?About
I think it is a bug. I re-produced it like this: Open new project. Enable c++11 features. Add a random class with a public variable. Create vector of this random class. Get the iterator. Try to access public variable. Either my workspace is corrupted or there is a bug in Eclipse that cannot parse this.About
@HalilKaskavalci I found this same bug. If I set the editor for c++11, iterators can't resolve. If I don't, std::unique_ptr can't resolve. Really annoying, since I use both.Baumbaugh
@Baumbaugh I reported the bug. bugs.eclipse.org/bugs/show_bug.cgi?id=397027 . It is quite annoying and I started to use boost libraries, they don't produce the error :)About
Just tried instructions from your blog post, and array is still unresolved.Egregious
@Jeff. strange. Is this resolved: #include<mutex> int blah(){ std::mutex a; std::lock_guard<std::mutex> locker(a); }. Have a look at my instructions again, I added how to use the nightly build of CDT.Biserrate
Nope, doesn't work with Indigo / MINGW (made it worse actually since now it doesn't find #include <iostream>... BTW, don't forget in your blog that -std=gnu++11 is only supported from gcc 4.7, you have to use -std=gnu++0x in 4.6.Rarely
Thanks.. in my case I didn't need to Deselect all except CDT GCC Built-in Compiler Settings.Gristle
It would have been nice to note that the restore defaults applies to ALL settings of the project cleaning the includes and libraries of the project not just the symbols tab. Now I have to manually add them.Pejorative
works for me! Thank you! (did it by your reference) I'va added -std=c++11 to providers and restore defaults in symbols. I think restore default in symbols saves me. Now unique_ptr is resolving.Liquate
Works on Luna (GNU/Linux). Restore Defaults is important.Faubourg
@VladislavIvanishin, could you add the missing steps if any to the answer?Biserrate
@JohanLundberg, there were no missing steps for me. As a matter of fact there is even an extra step in the detailed instruction (for the purposes the OP has stated). So basically it was -std=c++11 flag and restore defaults.Faubourg
On Kepler, Restore Defaults wasn't helpful and it would have thrown away some customizations. Instead, add -std=c++11 to the builtin compiler options as described above, apply the changes, then Project Menu > C/C++ Index > Rebuild and wait until it completes.Athalia
@Johan Lundberg can you take a look at my question - I feel like this is the same problem but I fail when attempting to apply the solution. linkSubmediant
Q
20

For the latest (Juno) eclipse cdt the following worked for me, no need to declare __GXX_EXPERIMENTAL_CXX0X__ on myself. This works for the the CDT indexer and as parameter for the compiler:

"your project name" -> right click -> properties:

C/C++ General -> Preprocessor Include Paths, Macros etc. -> switch to the tab named "Providers":

  • for "Configuration" select "Release" (and afterwards "debug")

  • switch off all providers and just select "CDT GCC Built-in Compiler Settings"

  • uncheck "Share setting entries between projects (global provider)"

  • in the "Command to get compiler specs:" add "-std=c++11" without the quotes (may work with quotes too)

  • hit apply and close the options

  • rebuild the index

Now all the c++11 related stuff should be resolved correctly by the indexer.

win7 x64, latest official eclipse with cdt mingw-w64 gcc 4.7.2 from the mingwbuilds project on sourceforge

Quietly answered 10/3, 2013 at 11:34 Comment(3)
still getting same erroneous editor warnings, as in Type 'std::thread' could not be resolved even though it compiles and executes OKAborning
u need to compile once with the new settings, so the parser will "learn" that the std=c++11 flag is setQuietly
depending on the compiler version it might be necessary to add -std=c++0x instead of -std=c++11 (e.g. debian wheezy)Hildredhildreth
M
15

I had the same problem on my Eclipse Juno. These steps solved the problem :

  • Go to Project -> Properties -> C/C++ General -> Path and Symbols -> Tab [Symbols].
  • Add the symbol : __cplusplus with the value 201103L
Mirza answered 8/3, 2014 at 17:21 Comment(4)
This should be accepted answer since it works also for Makefile projects!Kliment
@Jerk31 this is not working for Eclipse Juno running on windows(for me), I still see those complained un-necessary errors, despite the binary is working fine. Please help me!!!Corsage
I'm really sorry I can't help you on Windows I don't have the opportunity to try to execute any C++ project on this OS. I wish you the best and good luck !Mirza
I would avoid this solution, as it's overwriting what the compiler is defining. That said I'm about to go this route since I can't get -std option to work on Eclipse 2021 on UbuntuHann
G
14

For Eclipse CDT Kepler what worked for me to get rid of std::thread unresolved symbol is:

  1. Go to Preferences->C/C++->Build->Settings

  2. Select the Discovery tab

  3. Select CDT GCC Built-in Compiler Settings [Shared]

  4. Add the -std=c++11 to the "Command to get the compiler specs:" field such as:

${COMMAND} -E -P -v -dD -std=c++11 ${INPUTS}

  1. Ok and Rebuild Index for the project.

Adding -std=c++11 to project Properties/C/C++ Build->Settings->Tool Settings->GCC C++ Compiler->Miscellaneous->Other Flags wasn't enough for Kepler, however it was enough for older versions such as Helios.

Guggle answered 24/2, 2014 at 23:33 Comment(1)
For Eclipse Version: 2019-09 R. This solution worked for me, however, I've spent a lot of time before that. The problem was in Builder Settings: Project -> Properties -> C/C++ Build: in tab 'Builder Settings' choose 'Internal builder' for 'Builder type'.Ric
L
5

I can't yet comment so am writing my own answer:

It's related to __GXX_EXPERIMENTAL_CXX0X__ and it's valid for Eclipse Juno and CDT 8.x.

Some parts of this answer are already covered in other answers but I want it to be coherent.

To make it possible to build using stdc++11, one have to add specific flag for compiler. You can do that via project properties. To modify project properties RMB andProject properties or ALT + ENTER. Then C/C++ Build -> Settings -> Tool Settings -> GCC C++ Compiler -> Miscellaneous -> Other Flags. Put -std=c++11 at the end of line, for GCC it will look something like: -c -fmessage-length=0 -std=c++11. By adding -stdc++11 flag compiler (GCC) will declare __GXX_EXPERIMENTAL_CXX0X__ by itself.

At this point you can build project using all the goodness of C++11.

The problem is that Eclipse has it's own parser to check for errors - that's why you're still getting all the nasty errors in Eclipse editor, while at the same time you can build and run project without any. There is a way to solve this problem by explicitly declaring __GXX_EXPERIMENTAL_CXX0X__ flag for the project, one can do that (just like Carsten Greiner said): C/C++ General -> Paths and Symbols -> Symbols -> GNU C++. Click "Add..." and past __GXX_EXPERIMENTAL_CXX0X__ (ensure to append and prepend two underscores) into "Name" and leave "Value" blank. And now is the extra part I wanted to cover in comment to the first answer, go to: C/C++ General -> Preprocessor Include Path Macros etc. -> Providers, and Select CDT Managed Build Setting Entries then click APPLY and go back to Entries tab, under GNU C++ there should be now CDT Managed Build Setting Entries check if inside there is defined __GXX_EXPERIMENTAL_CXX0X__ if it is -> APPLY and rebuild index you should be fine at this point.

Ladle answered 26/2, 2013 at 20:23 Comment(0)
A
3

I had several issues too (Ubuntu 13.04 64-bit, g++-4.8, eclipse Juno 3.8.1, CDT 6.0.0). A lot of things are mentioned above, sorry to repeat those, but additionally I had problems utilizing

std::thread

as part of c++11 (adding -pthread for the linker solves that issue). Anyway, finally these settings worked fine:

Project -> Properties -> C/C++ Build -> Settings -> Miscellaneous. Add the

-std=c++11

flag for the GCC and G++ compilers. Click Apply.

For the linker, same window, Miscellaneous, Linker flags, added the

-pthread

flag. Shared library settings, Shared object name, add the

-Wl,--no-as-needed

flag too. Click Apply.

C/C++ General -> Paths and symbols -> Symbols TAB, GNU C++ selected, Add the

__GXX_EXPERIMENTAL_CXX0X__

(no value)

flag. Click Apply.

C/C++ General -> Preprocessor Include paths.. -> Providers tab : check

CDT GCC built-in Compiler Settings

and for "Command to get compiler specs", add the

-std=c++11

flag. Uncheck Share. Click Apply.

CDT Managages Build Setting Entries, check this too. Uncheck the two others. Click Apply.

Going back to the Entries tab, GNU C++ CDT Managages Build Setting Entries, you should now see your added

__GXX_EXPERIMENTAL_CXX0X__

entry.

That's it. When coding, typing

std::

can now auto-complete the thread class for instance, builds should work fine and there should be no

std::system_error'what(): Enable multithreading to use std::thread: Operation not permitted

at runtime.

Augur answered 25/1, 2014 at 22:42 Comment(1)
It was the Project -> Properties -> C/C++ Build -> Settings -> Miscellaneous step that worked for me. Thanks a bunch :DJordaens
B
2

I don't know if it is only me, the highest ranked solution doesn't work for me, my eclipse version is just normal eclipse platform installed by using sudo apt-get install eclipse in Ubuntu But I found a solution which adopts method together from both the highest ranked solution and the second, what I did to make it work is described as below (Note that the other steps like creating a C++ project etc. is ignored for simplicity)

Once you have created the C++ project

(1) C/C++ General -> Paths and Symbols -> Symbols -> GNU C++. Click "Add..." and paste GXX_EXPERIMENTAL_CXX0X (ensure to append and prepend two underscores) into "Name" and leave "Value" blank.

(2) Under C/C++ Build (at project settings), find the Preprocessor Include Path and go to the Providers Tab. Deselect all except CDT GCC Builtin Compiler Settings. Then untag Share settings entries … . Add the option -std=c++11 to the text box called Command to get compiler specs

After performed above 2 and 2 only steps, it works, the eclipse is able to resolve the unique_ptr, I don't know why this solution works, hope that it can help people.

Bikini answered 23/3, 2015 at 17:37 Comment(1)
This also worked for me (eclipse neon). At first I didn't deselect the other providers, which still caused problems, but deselecting all other providers than "CDT GCC Built-in Compiler Settings" and "CDT User Settings" worked. Thanks!Armington
A
2

Eclipse C/C++ does not recognize the symbol std::unique_ptr even though you have included the C++11 memory header in your file.

Assuming you are using the GNU C++ compiler, this is what I did to fix:

Project -> Properties -> C/C++ General -> Preprocessor Include Paths -> GNU C++ -> CDT User Setting Entries

  1. Click on the "Add..." button

  2. Select "Preprocessor Macro" from the dropdown menu

    Name: __cplusplus     Value:  201103L
    
  3. Hit Apply, and then OK to go back to your project

  4. Then rebuild you C++ index: Projects -> C/C++ Index -> Rebuild

Auxiliaries answered 8/3, 2016 at 23:28 Comment(1)
This is the only method that worked for me in Eclipse 2018-12. The "accepted" answer, etc., no longer work in 2018-12.Ritchey
U
2

For me on Eclipse Neon I followed Trismegistos answer here above , YET I also added an additional step:

  • Go to project --> Properties --> C++ General --> Preprocessor Include paths,Macros etc. --> Providers --> CDT Cross GCC Built-in Compiler Settings, append the flag "-std=c++11"

Hit apply and OK.

Cheers,

Guy.

Uproar answered 17/12, 2017 at 22:3 Comment(0)
A
0
  • right-click the project and go to "Properties"
  • C/C++ Build -> Settings -> Tool Settings -> GCC C++ Compiler -> Miscellaneous -> Other Flags. Put -lm at the end of other flags text box and OK.
Anamorphic answered 25/7, 2013 at 1:21 Comment(1)
What version of Eclipse is this?Analysis
B
0

Neither the hack nor the cleaner version work for Indigo. The hack is ignored, and the required configuration options are missing. For no apparent reason, build started working after not working and not providing any useful reason why. At least from the command line, I get reproducible results.

Birr answered 5/5, 2014 at 16:36 Comment(0)
M
0

To get support for C++14 in Eclipse Luna, you could do these steps:

  • In C++ General -> Preprocessor Include -> Providers -> CDT Cross GCC Built-in Compiler Settings, add "-std=c++14"
  • In C++ Build -> Settings -> Cross G++ Compiler -> Miscellaneous, add "-std=c++14"

Reindex your project and eventually restart Eclipse. It should work as expected.

Mirza answered 20/11, 2014 at 15:43 Comment(0)
S
0

I solved it this way on a Mac. I used Homebrew to install the latest version of gcc/g++. They land in /usr/local/bin with includes in /usr/local/include.

I CD'd into /usr/local/bin and made a symlink from g++@7whatever to just g++ cause that @ bit is annoying.

Then I went to MyProject -> Properties -> C/C++ Build -> Settings -> GCC C++ Compiler and changed the command from "g++" to "/usr/local/bin/g++". If you decide not to make the symbolic link, you can be more specific.

Do the same thing for the linker.

Apply and Apply and Close. Let it rebuild the index. For a while, it showed a daunting number of errors, but I think that was while building indexes. While I was figuring out the errors, they all disappeared without further action.


I think without verifying that you could also go into Eclipse -> Properties -> C/C++ -> Core Build Toolchains and edit those with different paths, but I'm not sure what that will do.

Shreve answered 3/4, 2018 at 17:37 Comment(0)
M
0

I had a similar problem using Eclipse C++ 2019-03 for a mixed C and C++ project that used std::optional and std::swap. What worked for me was this.

In the project Properties->C/C++ Build->Settings->Tool Settings->Cross G++ Compiler, remove -std=gnu++17 from Miscellaneous and put it in Dialect->Other Dialect Flags instead.

Morbidezza answered 24/3, 2019 at 17:22 Comment(0)
G
0

When using a cross compiler, I often get advanced custom build systems meticulously crafted by colleagues. I use "Makefile Project with Existing code" so most of the other answers are not applicable.

At the start of the project, I have to specify that I'm using a cross compiler in the wizard for "Makefile Project with Existing Code". The annoying thing is that in the last 10 or so years, the cross compiler button on that wizard doesn't prompt for where the cross compiler is. So in a step that fixes the C++ problem and the cross compiler problem, I have to go to the providers tab as mentioned by answers like @ravwojdyla above, but the provider I have to select is the cross-compiler provider. Then in the command box I put the full path to the compiler and I add -std=gnu++11 for the C++ standard I want to have support for. This works out as well as can be expected.

You can do this to an existing project. The only thing you might need to do is rerun the indexer.

I have never had to add the experimental flag or override __cplusplus's definition. The only thing is, if I have a substantial amount of modern C code, I have nowhere to put the C-specific standard option.

And for when things are going really poorly, getting a parser log, using that command in the Indexer submenu, can be very informative.

Gargan answered 18/1, 2020 at 23:23 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.