Erro de “inclusão não resolvida” com cabeçalhos de biblioteca padrão Eclipse CDT para C

96

Eu configurei o CDT para o eclipse e escrevi um programa simples hello world C:

#include <stdio.h>

int main(void){
    puts("Hello, world.");
    return 0;
}

O programa é compilado e executado corretamente, mas o eclipse continua mostrando este ponto de interrogação amarelo ao lado da declaração de inclusão que diz "Unresolved inclusion: <stdio.h>"quando eu coloco o mouse sobre ele.

Não afeta a execução do programa, mas acho bastante irritante.

Alguém tem ideia de como removê-lo?

Derrick Zhang
fonte
2
Você pensaria que o exemplo Hello World faria isso por você, ou pelo menos forneceria alguma ajuda. Se o eclipse não inclui um compilador, por que não inclui?
Doug Molineux

Respostas:

50

O compilador que o Eclipse está usando é capaz de resolver os símbolos perfeitamente, então o código será compilado corretamente.

Mas o preenchimento de código / indexador ou pré-processador que o Eclipse está usando não sabe onde stdio.hexiste.

Você precisa especificar o caminho do sistema de arquivos onde stdio.hestá localizado.

A documentação do Eclipse descreve isso em várias seções para o compilador:

E se o preenchimento de código / indexador ou pré-processador especificamente também não puder localizar stdio.h:

A localização exata de stdio.hdependerá do sistema para o qual você pretende escrever o código. Se você estiver escrevendo código para o mesmo sistema em que está executando o Eclipse, o local padrão é /usr/include/stdio.hpara Linux, macOS, Cygwin, etc.

Se você estiver fazendo compilação cruzada para um sistema de destino separado / remoto (por exemplo, Android, Raspberry Pi, STM32), ele estará localizado em algum lugar do SDK que você instalou para esse sistema. Você precisará consultar essa documentação específica do SDK.

Ardnew
fonte
2
Obrigado pela resposta. Mas onde está o caminho para o Ubuntu 11.10?
Derrick Zhang
Uma coisa que me confundiu foi que eu tive que adicionar o caminho para a guia "inclui", em vez da guia "caminhos da biblioteca". Sempre pensei que "colchete angular" inclui o que inclui "biblioteca".
aaaidan
1
Você especifica onde encontrar os arquivos de cabeçalho (ou seja, arquivos .h) na guia includes. Você informa ao vinculador onde ele pode encontrar arquivos de biblioteca compilados na guia de caminho da biblioteca. A convenção de aspas vs colchetes angulares provavelmente depende do compilador, mas sempre penso em <> como significando procurar primeiro no local da biblioteca do sistema padrão e "" como significando procurar primeiro no meu projeto.
Tod
2
Os compiladores modernos não fazem distinção entre aspas e colchetes angulares. Os cabeçalhos do sistema convencionalmente padrão ainda são colocados em colchetes angulares.
Seppo Enarvi
53

Achei essas respostas (incluindo a aceita) um tanto enigmáticas.

Para mim, eu tive que adicionar o caminho onde stdio.h está localizado (como @ardnew disse). No Eclipse, você abre as Propriedades do seu projeto, expande "C / C ++ General" e seleciona "Paths and Symbols".

Certifique-se de ter adicionado o includediretório para cada idioma que está usando. (No meu caso, eu precisava apenas adicioná-lo ao GNU C ++.)

insira a descrição da imagem aqui

aaaidan
fonte
Isso é assustadoramente próximo do que eu precisava! Só tive que mudar o nome do usuário no caminho.
Lucas
2
No OS X, você pode precisar instalar manualmente as ferramentas do desenvolvedor da linha de comando (que primeiro requer a instalação do Xcode) usando o comando /usr/bin/xcode-select --installe então você será capaz de apontar o Eclipse para/usr/include/
RobV
1
Em Yosemite. Usando Eclipse Juno. Isso meio que funcionou para mim, exceto que o caminho que dei era um pouco diferente (/ Users / SrinivasanNatarajan / android-ndk / plataformas / android-19 / arch-arm / usr / include). Mesmo que todos os erros não resolvidos tenham desaparecido, ainda tenho a dúvida de que 'eu estabeleci o caminho correto'. "Eclipse é realmente uma merda". Tive que gastar horas para configurar o IDE para desenvolvimento.
Srinivasan N
1
Obrigado. Apenas sua variante me ajudou.
Nikmoon
No meu caso (com MinGW), usei "File system ..." para adicionar o diretório "C: \ MinGW \ include"
Gary99
17

apenas adicionando à base de conhecimento, acabei de fazer isso no win7 com cygwin.

isso é o que parece funcionar para mim.

inclua caminhos para c:

D:\dev\cygwin\lib\gcc\i686-pc-cygwin\3.4.4\include
D:\dev\cygwin\usr\include

inclua caminhos para c ++:

D:\dev\cygwin\lib\gcc\i686-pc-cygwin\3.4.4\include
D:\dev\cygwin\lib\gcc\i686-pc-cygwin\3.4.4\include\c++
D:\dev\cygwin\usr\include

isso me dá uma compilação limpa de hello world.

Ray Tayek
fonte
Eu sou do futuro Eu vim dizer obrigado. Esta é realmente a primeira coisa que funcionou para mim. Eu nunca tive um hello mundo tão difícil. Obrigado senhor.
nVentimiglia
17

Vá para Projeto> Propriedades> C / C ++ Geral> Inclui pré-processador> Provedores e selecione ambos:

  • "Configurações do compilador integrado CDT GCC"
  • "Configurações do compilador integrado CDT CROSS GCC"

Para cada um deles selecione também a subentrada: "Usar provedor global compartilhado entre projetos".

Testado em Eclipse 4.8.0 no Ubuntu 16.04 com um hello world C e C ++.

Mike B
fonte
3
... e marque a caixa "Usar provedor global compartilhado entre projetos"
Urhixidur
Tive que verificar também a opção "Usar provedor global compartilhado entre projetos" como @Urhixidur mencionou. Eu tentei um grande número de soluções para esse erro de eclipse embutido e este é o que realmente funcionou para mim. Essas linhas eram irritantes. Obrigado!
CodeGuyRoss
10
  • Selecione Arquivo >> Novo Projeto
  • No Assistente de Projeto, selecione C / C ++ >> Projeto C ++
  • Na seção "Tipo de projeto", selecione " Projeto Makefile >> Projeto Hello world C ++ "
  • Na seção "Conjuntos de ferramentas", selecione " Linux GCC "

Isso pode resolver o problema. (Desculpem o inglês ruim)

Nader Aryabarzan
fonte
1
Eu fiz essas coisas, mas ainda não reconheceu que os cabeçalhos estão em / usr / include.
cardiff space man
Muito mais fácil do que adicionar cada um deles. Eu usei a opção de plataforma cruzada, que também funcionou bem (no Ubuntu)
panmari de
Muito útil! Ótimo inglês.
AturSams
Como você faz isso em um projeto existente?
Jay Elston
4

Estou usando o Eclipse com Cygwin e isso funcionou para mim:

Vá para Projeto> Propriedades> C / C ++ Geral> Inclui pré-processador ...> Provedores e selecione "CDT GCC Configurações do compilador integrado Cygwin [Compartilhado]".

superm0
fonte
4

Estou trabalhando com várias configurações de compilador cruzado , onde preciso usar locais diferentes para os arquivos de cabeçalho STD (e outras variáveis ​​de ambiente).

A solução foi configurar o indexador para que ele use a configuração ativa.
Infelizmente, devido a algum bug no eclipse , a opção não é armazenada localmente, então você tem que usar a configuração do espaço de trabalho se quiser salvar a configuração quando abrir o eclipse novamente.

Janela -> Preferências -> C / C ++ -> Indexador -> Usar configuração de compilação ativa

Isso fará com que o eclipse use o compilador correto que é definido com a configuração Cross GCC ativa do projeto.

Yochai Timmer
fonte
Tive o mesmo problema, compilação cruzada para ESP8266. É uma pena que esta página esteja tão lotada, tive que descobrir sozinho.
Michael Böckling
Obrigado por isso. Também tive esse problema após criar várias configurações de compilador cruzado (para diferentes versões do SDK embutido ESP32 "ESP-IDF"). Os cabeçalhos corretos não estavam sendo selecionados pelo Indexador. Essa configuração parece permitir que o indexador use o mesmo ambiente que a configuração ativa, o que no meu caso permitiu que ele pegasse os cabeçalhos certos.
davidA
3

Como as principais respostas observam, é necessário especificar onde as pastas de construção estão localizadas, que podem ser adicionadas por meio de uma caixa de diálogo acessada clicando com o botão direito do mouse no projeto e selecionando Propriedades-> C / C ++ Geral-> Caminhos e Símbolos.

A questão restante é quais caminhos precisam ser adicionados.

Se você configurou o gcc corretamente para acesso de linha de comando e precisa saber quais são os caminhos de inclusão padrão que ele usa, basta perguntar; dependendo de qual idioma você está interessado, use:

gcc -x c -v -E /dev/null
gcc -x c++ -v -E /dev/null

... isso irá listar as configurações padrão do compilador que são usadas ao invocar gcc (e este comando também funciona se "gcc" for realmente um apelido para clang, como no OSX).

/dev/null é usado como um arquivo vazio - estamos dizendo ao gcc para analisar um arquivo vazio

-x <language> especifica o idioma para compilar, necessário porque não estamos usando um arquivo com uma extensão que especifica o idioma

-v saída detalhada, que inclui a saída dos caminhos de inclusão

-E execute apenas o pré-processamento, produza o arquivo pré-processado (isso evita que o gcc reclame que um arquivo vazio não compila corretamente)

Na parte inferior estará a lista de diretórios de inclusão:

#include "..." search starts here:
#include <...> search starts here:
 /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1
 /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/7.0.2/include
 /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include
 /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/usr/include
 /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/System/Library/Frameworks (framework directory)
End of search list.

Se você inserir os diretórios listados aqui, na ordem listada, no diálogo de caminhos e símbolos do Eclipse, o CDT do Eclipse deve ser capaz de localizar os cabeçalhos padrão e talvez alguns cabeçalhos adicionais específicos para seu sistema operacional.

(Agradecemos a resposta de devnull a uma pergunta relacionada.)

Theodore Murdock
fonte
MUITO útil mesmo.
sancho.s ReinstateMonicaCellio
1

No ADT, fiz o seguinte:

  1. clique com o botão direito no projeto e selecione Propriedades
  2. expanda C / C ++ Geral e selecione Pré-processador Incluir Caminhos, Macros etc.
  3. selecione as entradas de configuração do usuário CDT
  4. selecione Adicionar ... no menu à direita
  5. Em Adicionar diretório de inclusão, altere o caminho do projeto para o caminho do sistema de arquivos
  6. Navegue até o diretório que contém seus arquivos de inclusão
  7. mexa e repita conforme necessário
user330844
fonte
1

Normalmente, o Eclipse deve ser capaz de resolver automaticamente os arquivos de inclusão padrão. Ele faz isso chamando gcc e perguntando sua configuração. Muito provavelmente o Eclipse não está encontrando seu gcc (ou pelo menos não a versão que você usa para compilar).

Em vez de especificar todos os caminhos de inclusão padrão nas configurações do projeto, você provavelmente deseja se certificar de que o Eclipse encontre o gcc. Adicione o diretório onde gcc é encontrado à variável de ambiente PATH antes de iniciar o Eclipse.

Se você deseja que projetos diferentes usem compiladores diferentes, convém ajustar as opções de descoberta. Eles estão ocultos por padrão, então primeiro habilite-os em Janela> Preferências> C / C ++> Configurações de páginas de propriedades> Exibir página "Opções de descoberta". Em seguida, você pode encontrá-los em C / C ++ Build> Discovery Options nas propriedades do projeto.

Seppo Enarvi
fonte
1

Estou usando o IDE CodeWarrior baseado em Eclipse para projetos incorporados e acabei de resolver esse problema excluindo e adicionando novamente os endereços de origem para Propriedades do Projeto-> C / C ++ Geral-> Caminho e Sybols-> Incluir Diretórios. Isso significa que há muitos motivos para aceitar a mensagem "Inclusão não resolvida:" e também há muitas soluções.

Enes Akyay
fonte
0

Um erro que tive ao configurar caminhos e símbolos é que inicialmente configurei os caminhos de inclusão para um idioma diferente. Estou trabalhando com CDT e Cygwin gnu C ++. Portanto, você deve configurar símbolos e caminhos na linguagem GNU C ++.insira a descrição da imagem aqui

Rodolk
fonte
0

Também definido ${COMMAND}para gccLinux

Debaixo:

  • Projeto
  • Propriedades
  • C / C ++ Geral
  • O pré-processador inclui caminhos, macros, etc.
  • Provedores
  • Configurações do compilador integrado CDT GCC
  • Comando para obter especificações do compilador

Substituir:

${COMMAND} ${FLAGS} -E -P -v -dD "${INPUTS}"

com:

gcc -std=c99 -E -P -v -dD "${INPUTS}"

Se você não fizer isso, o Eclipse stdout mostrará:

Unable to find full path for "-E"

e registros em ${HOME}/eclipse-workspace/.metadata/.logshow:

!ENTRY org.eclipse.cdt.core 4 0 2020-04-23 20:17:07.288
!MESSAGE Error: Cannot run program "-E": Unknown reason

porque ${COMMAND} ${FLAGS}estão vazios, e assim o Eclipse tenta executar o -Eque vem a seguir.

Gostaria de saber se podemos definir corretamente as variáveis COMMANDe FLAGSnas configurações, mas tentei adicioná-los como variáveis ​​de construção e não funcionou.

Versão C ++ da pergunta: Como resolver "Inclusão não resolvida: <iostream>" em um arquivo C ++ no Eclipse CDT?

Testado em Eclipse 2020-03 (4.15.0), Ubuntu 19.10 e este projeto Makefile mínimo com fontes existentes .

Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
fonte
0

Você verifica se ele compila a partir da linha de comando? Para mim ajuda no Linux, instale libc-dev.

Jan B Noir
fonte