Como ativar o suporte a C ++ 11 / C ++ 0x no Eclipse CDT?


210

Eclipse 3.7.1 CDT 1.4.1 GCC 4.6.2

Este é um exemplo de uma parte do código C ++ 11:

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

O editor Eclipse reclama sobre:

Function 'unique_ptr' could not be resolved

A compilação Makefile funciona bem. Como fazer o Eclipse parar de reclamar sobre esse tipo de erro?


12
No mínimo, deve serstd::unique_ptr<char[]>
Cubbi

Não tenho certeza de que está correto - char [] é conversível para char * e unique_ptr <char> é um ponteiro para char, como char *
Nick

1
Não unique_ptr<char>chamaria delete, o que está errado desde que foi criado new[]?
Dietrich Epp

6
@ Nick: Não, ele está certo. O modo como você o escreveu fará com deleteque seja chamado quando você precisar delete[] . O unique_ptr<char>pressuposto é que ele está recebendo um ponteiro, que é excluído com delete. unique_ptr<char[]>espera uma matriz, que é excluída delete[]corretamente.
Nicol Bolas

Respostas:


224

Encontrei este artigo no fórum Eclipse, apenas segui essas etapas e funciona para mim. Estou usando o Eclipse Indigo 20110615-0604 no Windows com uma configuração do Cygwin.

  • Faça um novo projeto C ++
  • Opções padrão para tudo
  • Depois de criado, clique com o botão direito do mouse no projeto e vá em "Propriedades"
  • Compilação C / C ++ -> Configurações -> Configurações da ferramenta -> Compilador GCC C ++ -> Diversos -> Outros sinalizadores. Coloque -std=c++0x(ou para a versão mais recente do compilador -std=c++11no final. ... em vez do compilador GCC C ++, também tenho o compilador Cygwin
  • C / C ++ Geral -> Caminhos e Símbolos -> Símbolos -> GNU C ++. Clique em "Adicionar ..." e cole __GXX_EXPERIMENTAL_CXX0X__(certifique-se de acrescentar e colocar dois sublinhados) em "Nome" e deixe "Valor" em branco.
  • Pressione Aplicar, faça o que for necessário e, em seguida, pressione OK.

Agora, há uma descrição disso nas Perguntas frequentes do Eclipse : Perguntas frequentes sobre o Eclipse / Recursos do C ++ 11 .

Configuração de imagem do Eclipse


2
Sim, funcionou! Mas, certifique-se de preceder & acrescentar dois sublinhados para GXX_EXPERIMENTAL_CXX0X - Vou aceitar isso, entretanto
Nick

5
Isso removeu erros espúrios do editor? Não tenho nenhum problema com a compilação e novos tipos std são reconhecidos, mas não consigo me livrar dos erros de sintaxe do editor para o intervalo com base em loops e referências de valor &&.
juanchopanza

7
A questão do acompanhamento natural agora se torna: podemos otimizar nosso fluxo de trabalho salvando essas configurações específicas do projeto C ++ em um novo modelo de projeto Eclipse, como "Projeto C ++ 11"?
Nordlöw

38
Nota: para quem procura a resposta para Juno, isso não funciona .
Christopher

4
Para kepler / juno, a solução é encontrada nesta resposta . Ele foi postado na edição da resposta de Johan Lundberg abaixo, mas também notei aqui, para tornar a resposta aceita mais completa.
Inusável Lumière

150

Instrução para Eclipse CDT 4.4 Luna e 4.5 Mars

Primeiro, antes de criar o projeto, configure o analisador de sintaxe do Eclipse:

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

na caixa de texto intitulada Command to get compiler specsanexar-std=c++11

Agora você pode criar um projeto, a configuração depende do tipo de projeto que você criou:

Para projeto criado como: Arquivo -> Novo -> Projeto -> C / C ++ -> Projeto C ++

Clique com o botão direito do mouse no projeto criado e abra

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

Coloque -std=c++11na caixa de texto autorizada other dialect flagsou selecione ISO C++11na lista Language standardsuspensa.

Para o projeto CMake

Gere arquivos de projeto eclipse (dentro do seu projeto)

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

Em seguida, importe o diretório gerado para eclipse como projeto eclipse padrão. Clique com o botão direito do mouse no projeto e abra

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

ative CDT GCC Build-in Compiler Settingse mova mais alto que Contributed PathEntry Containers(Isso é importante)

Última etapa comum

recompile, gere novamente Project-> C/C++ Indexe reinicie o Eclipse.


1
Funcionou perfeitamente mesmo sem a necessidade de reiniciar o eclipse. Obrigado.
Prasannak

Obrigado. Nenhuma outra resposta funcionou para mim em Luna também.
Mohamed El-Nakib

Ainda funciona em Marte. Mais que ótima resposta! Se eu pudesse votar nessa resposta duas vezes!
Mohamed El-Nakib

Obrigado! Esta é a resposta mais útil para o problema que encontrei (4.5)
AturSams

2
Para o Eclipse Neon.3, com um projeto C ++ Makefile, a configuração do projeto a ser adicionada -std=c++11era Project Properties -> C/C++ General -> Preprocessor Include Paths, Macros etc. -> Providers [tab] -> CDT GCC Built-in Compiler Settings -> Command used to get compiler specs:. Anexe seu -std=c++11a isso. Eu o defini nas configurações globais da área de trabalho como sugerindo, mas não foi copiado no local que descrevi acima quando criei um novo Makefileprojeto.
BeeOnRope

112

Atualização 2016:

A partir do gcc 6 ( alterações ), o dialeto C ++ padrão é C ++ 14. Isso significa que, a menos que você precise explicitamente de um dialeto mais novo ou mais antigo que o, não precisará mais fazer nada com o eclipse.

Para Luna e Marte

Esta seção do wiki da comunidade incorpora a resposta de Trismegistos;

1. Antes de criar o projeto, configure o analisador de sintaxe Eclipse:

Janela -> Preferências -> C / C ++ -> Construção -> Configurações -> Descoberta -> Configurações do compilador incorporado do CDT GCC

na caixa de texto intitulada Comando para obter as especificações do compilador anexadas -std=c++14 2. Crie um projeto, a configuração depende do tipo de projeto que você criou:

Para projeto criado como: Arquivo -> Novo -> Projeto -> C / C ++ -> Projeto C ++

Clique com o botão direito do mouse no projeto criado e abra

Propriedades -> Compilação C / C ++ -> Configurações -> Configurações da ferramenta -> Compilador GCC C ++ -> Dialeto

Coloque -std=c++14na caixa de texto intitulada outros sinalizadores de dialeto ou selecione ISO C ++ 11 no menu suspenso Padrão do idioma.

Agora há uma nova maneira de resolver isso sem o hack GXX_EXPERIMENTAL.

Para versões mais recentes : (atualmente Juno e Kepler Luna ):

Nas versões mais recentes do Juno, as configurações estão localizadas em Project properties -> C/C++ General -> Preprocessor Include Paths, Macros etc. -> tab Providers -> CDT GCC Builtin Compiler Settings ().

Versões anteriores 2012/2013:

  1. Em C / C ++ Build (nas configurações do projeto), localize o Caminho de inclusão do pré - processador e vá para a guia Provedores . Desmarque todas, exceto as configurações do compilador interno CDT GCC. Desmarque Compartilhar entradas de configurações…. Adicione a opção -std = c ++ 11 à caixa de texto chamada Command para obter especificações do compilador.

  2. Vá para caminhos e símbolos. Em símbolos, clique em restaurar padrões e, em seguida, aplique.


Notas:

O Eclipse é exigente ao clicar em Aplicar, você precisa fazer isso sempre que sair de uma guia de configurações.

[Autopromoção]: escrevi minhas próprias instruções mais detalhadas com base no exposto acima. http://scrupulousabstractions.tumblr.com/post/36441490955/eclipse-mingw-builds

Graças ao usuário Nobodyem https://stackoverflow.com/a/13635080/1149664


3
Obrigado, mas não me ajudou a resolver referências do c ++ 11. O programa é compilado corretamente, mas o eclipse não pode resolvê-los. Quando eu checo "array", #ifndef __GXX_EXPERIMENTAL_CXX0X__retorna true e o código abaixo não é analisado. Quando adiciono __GXX_EXPERIMENTAL_CXX0X__aos símbolos do projeto, a matriz é resolvida, mas as referências do meu projeto são alteradas. Qual pode ser o problema aqui?
Halil Kaskavalci

1
Eu acho que é um bug. Eu o reproduzi assim: Abra um novo projeto. Ative os recursos do c ++ 11. Adicione uma classe aleatória com uma variável pública. Crie o vetor dessa classe aleatória. Obtenha o iterador. Tente acessar a variável pública. Meu espaço de trabalho está corrompido ou há um erro no Eclipse que não pode analisar isso.
Halil Kaskavalci

1
@HalilKaskavalci Encontrei esse mesmo bug. Se eu definir o editor para o c ++ 11, os iteradores não poderão resolver. Caso contrário, std :: unique_ptr não pode resolver. Realmente irritante, já que eu uso os dois.
Kian

1
@ Kian eu relatei o bug. bugs.eclipse.org/bugs/show_bug.cgi?id=397027 . É muito chato e eu comecei a usar bibliotecas de impulso, eles não produzem o erro :)
Halil Kaskavalci

1
funciona para mim! Obrigado! (fiz isso por sua referência) Adicionei -std = c ++ 11 aos provedores e restaure os padrões nos símbolos. Eu acho que restaurar o padrão em símbolos me salva. Agora unique_ptr está resolvendo.
Denis Zaikin

20

Para o mais recente (Juno) eclipse cdt, o seguinte funcionou para mim, sem necessidade de declarar __GXX_EXPERIMENTAL_CXX0X__sobre mim mesmo. Isso funciona para o indexador CDT e como parâmetro para o compilador:

"nome do seu projeto" -> clique com o botão direito do mouse -> propriedades:

C / C ++ Geral -> Pré-processador Incluir Caminhos, Macros etc. -> alterne para a guia denominada "Provedores":

  • para "Configuração", selecione "Liberar" (e depois "depurar")

  • desligue todos os provedores e selecione "Configurações do compilador interno do CDT GCC"

  • desmarque "Compartilhar entradas de configuração entre projetos (provedor global)"

  • no "Comando para obter especificações do compilador:" add "-std = c ++ 11" sem as aspas (pode funcionar com aspas também)

  • clique em aplicar e feche as opções

  • reconstruir o índice

Agora todo o material relacionado ao c ++ 11 deve ser resolvido corretamente pelo indexador.

win7 x64, o mais recente eclipse oficial com o cdt mingw-w64 gcc 4.7.2 do projeto mingwbuilds no sourceforge


ainda recebendo mesmos avisos editor errôneas, como no tipo 'std :: fio' não pôde ser resolvido, mesmo que compila e executa OK
Scott Stensland

2
u precisa compilar uma vez com as novas configurações, de modo que o analisador irá "aprender" que o std = c ++ 11 sinalizador é definido
Andreas

dependendo da versão do compilador pode ser necessário adicionar -std = c ++ 0x vez de -std = c ++ 11 (por exemplo, debian wheezy)
xmoex

15

Eu tive o mesmo problema no meu Eclipse Juno. Estas etapas resolveram o problema:

  • Vá para Project -> Properties -> C/C++ General -> Path and Symbols -> Tab [Symbols].
  • Adicione o símbolo: __cplusplus com o valor 201103L

2
Esta resposta deve ser aceita, pois também funciona para projetos Makefile!
Omikron

@ Jerk31 isso não está funcionando para o Eclipse Juno rodando no Windows (para mim), ainda vejo os erros desnecessários reclamados, apesar do binário estar funcionando bem. Por favor me ajude!!!
overexchange

Sinto muito por não poder ajudá-lo no Windows. Não tenho a oportunidade de tentar executar nenhum projeto C ++ neste sistema operacional. Desejo-lhe boa e boa sorte!
Jerome

13

Para o Eclipse CDT Kepler, o que funcionou para me livrar do std::threadsímbolo não resolvido é:

  1. Vá para Preferências-> C / C ++ -> Construção-> Configurações

  2. Selecione a guia Descoberta

  3. Selecione Configurações do compilador interno do CDT GCC [compartilhado]

  4. Adicione o -std = c ++ 11 ao campo "Comando para obter as especificações do compilador:", como:

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

  1. Ok e recrie o índice para o projeto.

Adicionar -std=c++11ao projeto Properties/C/C++ Build->Settings->Tool Settings->GCC C++ Compiler->Miscellaneous->Other Flags não foi suficiente para o Kepler, no entanto, foi suficiente para versões mais antigas, como o Helios.


Para a versão Eclipse: 2019-09 R. Esta solução funcionou para mim, no entanto, passei muito tempo antes disso. O problema estava em Configurações do construtor: Projeto -> Propriedades -> Construção C / C ++: na guia 'Configurações do construtor', escolha 'Construtor interno' para 'Tipo de construtor'.
grekhss

5

Ainda não posso comentar, por isso estou escrevendo minha própria resposta:

Está relacionado __GXX_EXPERIMENTAL_CXX0X__e é válido para Eclipse Juno e CDT 8.x.

Algumas partes desta resposta já estão cobertas em outras respostas, mas quero que seja coerente.

Para tornar possível construir usando o stdc ++ 11, é necessário adicionar um sinalizador específico para o compilador. Você pode fazer isso através das propriedades do projeto. Para modificar as propriedades do projeto RMBe Project propertiesou ALT + ENTER. Em seguida, C / C ++ Build -> Configurações -> Configurações da ferramenta -> Compilador GCC C ++ -> Diversos -> Outros sinalizadores. Coloque -std = c ++ 11 no final da linha, para o GCC que será algo parecido com: -c -fmessage-length=0 -std=c++11. Adicionando -stdc ++ 11 o compilador de sinalizadores (GCC) declarará __GXX_EXPERIMENTAL_CXX0X__por si só.

Neste ponto, você pode criar um projeto usando toda a bondade do C ++ 11.

O problema é que o Eclipse possui seu próprio analisador para verificar se há erros - é por isso que você ainda está recebendo todos os erros desagradáveis ​​no editor Eclipse, enquanto ao mesmo tempo pode criar e executar o projeto sem nenhum. Existe uma maneira de resolver esse problema declarando explicitamente o __GXX_EXPERIMENTAL_CXX0X__sinalizador para o projeto; é possível fazer isso (como Carsten Greiner disse): C / C ++ Geral -> Caminhos e Símbolos -> Símbolos -> GNU C ++. Clique em "Adicionar ..." e depois __GXX_EXPERIMENTAL_CXX0X__(certifique-se de acrescentar e colocar dois sublinhados) em "Nome" e deixe "Valor" em branco. E agora é a parte extra que eu queria abordar no comentário à primeira resposta, vá para: C / C ++ Geral -> Pré-processador Incluir macros de caminho etc. -> Provedores e SelecionarCDT Managed Build Setting Entriesclique em APLICAR e volte para a guia Entradas, no GNU C ++ agora deve haver Entradas de Configuração de Compilação Gerenciada CDT, verifique se lá dentro está definido __GXX_EXPERIMENTAL_CXX0X__se está -> APLICAR e reconstruir o índice, você deve estar bem neste momento.


3

Também tive vários problemas (Ubuntu 13.04 de 64 bits, g ++ - 4.8, eclipse Juno 3.8.1, CDT 6.0.0). Muitas coisas são mencionadas acima, desculpe repeti-las, mas, além disso, tive problemas ao utilizar

std::thread

como parte do c ++ 11 (adicionar -pthread para o vinculador resolve esse problema). Enfim, finalmente essas configurações funcionaram bem:

Projeto -> Propriedades -> Compilação C / C ++ -> Configurações -> Diversos. Adicione o

-std=c++11

sinalizador para os compiladores GCC e G ++. Clique em Aplicar.

Para o vinculador, a mesma janela, Diversos, sinalizadores de vinculador, adicionou o

-pthread

bandeira. Configurações da biblioteca compartilhada, Nome do objeto compartilhado, adicione o

-Wl,--no-as-needed

bandeira também. Clique em Aplicar.

C / C ++ Geral -> Caminhos e símbolos -> Símbolos TAB, GNU C ++ selecionado, Adicionar o

__GXX_EXPERIMENTAL_CXX0X__

(sem valor)

bandeira. Clique em Aplicar.

C / C ++ Geral -> Pré-processador Incluir caminhos .. -> guia Provedores: marque

Configurações do compilador CDT GCC

e para "Comando para obter especificações do compilador", adicione o

-std=c++11

bandeira. Desmarque Compartilhar. Clique em Aplicar.

O CDT gerencia entradas de configuração de compilação, verifique isso também. Desmarque as duas outras. Clique em Aplicar.

Voltando à guia Entradas, o GNU C ++ CDT Gerencia Configurações de Configuração de Entradas, agora você verá as

__GXX_EXPERIMENTAL_CXX0X__

entrada.

É isso aí. Ao codificar, digitar

std::

agora é possível concluir automaticamente a classe de encadeamento, por exemplo, as compilações devem funcionar bem e não deve haver

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

em tempo de execução.


Foi o Project -> Properties -> C/C++ Build -> Settings -> Miscellaneouspasso que funcionou para mim. Obrigado, um monte: D
Jake88

2

Eu não sei se sou apenas eu, a solução mais alta classificada não funciona para mim, minha versão do eclipse é apenas a plataforma eclipse normal instalada usando o sudo apt-get install eclipse no Ubuntu Mas eu encontrei uma solução que adota o método juntos da solução com a classificação mais alta e da segunda, o que fiz para fazê-lo funcionar é descrito abaixo (observe que outras etapas, como a criação de um projeto C ++ etc., são ignoradas por simplicidade)

Depois de criar o projeto C ++

(1) C / C ++ Geral -> Caminhos e Símbolos -> Símbolos -> GNU C ++. Clique em "Adicionar ..." e cole GXX_EXPERIMENTAL_CXX0X (certifique-se de acrescentar e colocar dois sublinhados) em "Nome" e deixe "Valor" em branco.

(2) Em Compilação C / C ++ (nas configurações do projeto), localize o Caminho de inclusão do pré-processador e vá para a guia Provedores. Desmarque todas, exceto as configurações do compilador interno CDT GCC. Desmarque Compartilhar entradas de configurações…. Adicione a opção -std = c ++ 11 à caixa de texto chamada Command para obter especificações do compilador

Depois de executar acima de 2 e 2 apenas etapas, ele funciona, o eclipse é capaz de resolver o unique_ptr, não sei por que essa solução funciona, espero que possa ajudar as pessoas.


Isso também funcionou para mim (eclipse neon). No começo, não desmarquei os outros provedores, o que ainda causava problemas, mas desmarcar todos os outros provedores, exceto "Configurações do compilador interno do CDT GCC" e "Configurações do usuário do CDT". Obrigado!
zpon 7/09/16

2

O Eclipse C / C ++ não reconhece o símbolo std::unique_ptrmesmo que você tenha incluído o cabeçalho de memória C ++ 11 em seu arquivo.

Supondo que você esteja usando o compilador GNU C ++, foi o que fiz para corrigir:

Projeto -> Propriedades -> Geral do C / C ++ -> Caminhos de inclusão do pré-processador -> GNU C ++ -> Entradas de configuração do usuário CDT

  1. Clique no botão "Adicionar ..."

  2. Selecione "Macro de pré-processador" no menu suspenso

    Name: __cplusplus     Value:  201103L
  3. Pressione Aplicar e, em seguida, OK para voltar ao seu projeto

  4. Em seguida, recrie o índice C ++: Projetos -> Índice C / C ++ -> Reconstruir


Este é o único método que funcionou para mim no Eclipse 2018-12. A resposta "aceita" etc. não funciona mais em 2018-12.
David Steinhauer

1

Para mim, no Eclipse Neon , segui a resposta do Trismegistos aqui acima , mas também adicionei uma etapa adicional:

  • Vá para o projeto -> Propriedades -> Geral em C ++ -> Pré-processador, incluindo caminhos, macros etc. -> Provedores -> Configurações do compilador interno CDT Cross GCC, acrescente o sinalizador "-std = c ++ 11"

Clique em Aplicar e OK.

Felicidades,

Cara.


0
  • clique com o botão direito do mouse no projeto e vá em "Propriedades"
  • Compilação C / C ++ -> Configurações -> Configurações da ferramenta -> Compilador GCC C ++ -> Diversos -> Outros sinalizadores. Coloque -lm no final de outras caixas de texto de sinalizadores e OK.

Que versão do Eclipse é essa?
Braiam

0

Nem o hack nem a versão mais limpa funcionam para o Indigo. O hack é ignorado e as opções de configuração necessárias estão ausentes. Sem motivo aparente, o build começou a funcionar depois de não funcionar e não forneceu nenhum motivo útil para isso. Pelo menos na linha de comando, obtenho resultados reproduzíveis.


0

Para obter suporte para C ++ 14 no Eclipse Luna, você pode executar estas etapas:

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

Reinicialize seu projeto e, eventualmente, reinicie o Eclipse. Deve funcionar como esperado.


0

Eu resolvi dessa maneira em um Mac. Usei o Homebrew para instalar a versão mais recente do gcc / g ++. Eles pousam em / usr / local / bin com inclui em / usr / local / include.

Coloquei o CD em / usr / local / bin e fiz um link simbólico de g ++ @ 7 para qualquer g ++, pois esse @ bit é irritante.

Depois fui para MyProject -> Propriedades -> Compilação C / C ++ -> Configurações -> Compilador GCC C ++ e alterei o comando de "g ++" para "/ usr / local / bin / g ++". Se você decidir não criar o link simbólico, poderá ser mais específico.

Faça o mesmo para o vinculador.

Aplicar e Aplicar e Fechar. Deixe reconstruir o índice. Por um tempo, mostrou um número assustador de erros, mas acho que foi ao criar índices. Enquanto eu descobria os erros, todos eles desapareceram sem mais ações.


Eu acho que sem verificar se você também pode entrar no Eclipse -> Propriedades -> C / C ++ -> Core Build Toolchains e editar aqueles com caminhos diferentes, mas não tenho certeza do que isso fará.


0

Eu tive um problema semelhante ao usar o Eclipse C ++ 2019-03 para um projeto misto de C e C ++ que usava std :: optional e std :: swap. O que funcionou para mim foi isso. No projeto Propriedades-> C / C ++ Build-> Configurações-> Configurações da Ferramenta-> Cross G ++ Compiler, remova -std = gnu ++ 17 de Miscellaneous e coloque-o em Dialect-> Other Dialect Flags.


0

Ao usar um compilador cruzado, geralmente recebo sistemas avançados de criação personalizados meticulosamente criados por colegas. Eu uso "Projeto Makefile com código existente" para que a maioria das outras respostas não seja aplicável.

No início do projeto, preciso especificar que estou usando um compilador cruzado no assistente para "Makefile Project with Existing Code". O irritante é que, nos últimos 10 anos, o botão do compilador cruzado nesse assistente não pergunta onde está o compilador cruzado. Portanto, em uma etapa que corrige o problema do C ++ e o problema do compilador cruzado, tenho que ir para a guia provedores, como mencionado em respostas como @ravwojdyla acima, mas o provedor que devo selecionar é o provedor do compilador cruzado. Em seguida, na caixa de comando, coloquei o caminho completo para o compilador e adicionei -std = gnu ++ 11 para o padrão C ++ para o qual desejo suporte. Isso funciona tão bem quanto se pode esperar.

Você pode fazer isso com um projeto existente. A única coisa que você precisa fazer é executar novamente o indexador.

Nunca tive que adicionar a flag experimental ou substituir a definição de __cplusplus. A única coisa é que, se eu tiver uma quantidade substancial de código C moderno, não tenho onde colocar a opção padrão específica de C.

E quando as coisas estão indo muito mal, obter um log do analisador, usando esse comando no submenu Indexador, pode ser muito informativo.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.