Eclipse CDT for C標準ライブラリヘッダーの「未解決のインクルード」エラー


96

私は日食用にCDTをセットアップし、単純なhello world Cプログラムを作成しました。

#include <stdio.h>

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

プログラムは正しくビルドおよび実行されますが、Eclipseは、"Unresolved inclusion: <stdio.h>"マウスを上に置くと表示されるインクルージョンステートメントの横にこの黄色の疑問符を表示し続けます。

プログラムの実行には影響しませんが、私はかなり煩わしいと思います。

誰でもそれを削除する方法を知っていますか?


2
Hello Worldの例はこれを行うか、少なくともいくつかの助けを提供すると思います。Eclipseにコンパイラが含まれていない場合、なぜ含まれていないのですか?
Doug Molineux

回答:


50

Eclipseが使用しているコンパイラは、シンボルを適切に解決できるため、コードは正常にコンパイルされます。

しかし、Eclipseが使用しているコード補完/インデクサーまたはプリプロセッサーは、どこにstdio.h存在するのかわかりません。

stdio.hが置かれているファイルシステムのパスを指定する必要があります。

Eclipseのドキュメントでは、コンパイラのいくつかのセクションでこれについて説明しています。

そして、コード補完/インデクサーまたはプリプロセッサーも明確に特定できない場合stdio.h

の正確な場所はstdio.h、コードを記述しようとしているシステムによって異なります。Eclipseを実行しているのと同じシステムのコードを記述している場合、標準の場所は/usr/include/stdio.hLinux、macOS、Cygwinなどです。

個別/リモートのターゲットシステム(Android、Raspberry Pi、STM32など)をクロスコンパイルする場合、そのシステム用にインストールしたSDKのどこかに配置されます。その特定のSDKドキュメントを参照する必要があります。


2
返信いただきありがとうございます。しかし、Ubuntu 11.10のパスはどこにありますか?
デリックチャン

私を混乱させた1つのことは、「ライブラリパス」タブではなく、「インクルード」タブへのパスを追加しなければならないことでした。「山かっこ」のインクルードは「ライブラリ」のインクルードだといつも思っていました。
aaaidan

1
[インクルード]タブでヘッダーファイル(つまり.hファイル)の場所を指定します。ライブラリパスタブで、コンパイルされたライブラリファイルの場所をリンカーに通知します。引用符と山括弧の規則はおそらくコンパイラに依存しますが、<>は常に標準システムライブラリの場所で最初に検索することを意味し、 ""はプロジェクトを最初に検索することを意味すると常に考えます。
Tod

2
最新のコンパイラーは、引用符と山括弧を区別しません。従来の標準システムヘッダーは、山かっこで囲まれています。
Seppo Enarvi 2012

53

私はこれらの答え(受け入れられたものを含む)をいくぶん不可解に見つけました。

私にとっては、(@ ardnewが言ったように)stdio.hが配置されているパスを追加する必要がありました。Eclipseでプロジェクトのプロパティを開き、「C / C ++ General」を展開して、「Paths and Symbols」を選択します。

include使用している各言語のディレクトリを追加したことを確認してください。(私の場合、それをGNU C ++に追加するだけで済みました。)

ここに画像の説明を入力してください


これは私が必要としているものに不気味に近いです!パス内のユーザー名を変更する必要がありました。
Lucas

2
OS Xでは、コマンドを使用してコマンドライン開発者ツール(最初にXcodeをインストールする必要があります)を手動でインストールする必要がある場合があり/usr/bin/xcode-select --installます。/usr/include/
そうすると、

1
ヨセミテ。Eclipse Junoを使用する。私が与えたパスが少し違っていたことを除いて、この種の方法は私にとってはうまくいきました(/ Users / SrinivasanNatarajan / android-ndk / platforms / android-19 / arch-arm / usr / include)。未解決のエラーはすべて消えましたが、「正しいパスを設定したのか」という疑問はまだあります。「エクリプスは本当にひどい」。IDEを開発用にセットアップするには、何時間も費やす必要がありました。
スリニバサンN

1
ありがとう。あなたの亜種だけが私を助けました。
Nikmoon 16

私の場合(MinGWを使用)、「ファイルシステム...」を使用してディレクトリ「C:\ MinGW \ include」を追加しました
Gary99

17

ナレッジベースに追加するだけで、cygwinを使用してwin7でこれを実行しました。

これは私にとってはうまくいくようです。

cのパスを含める:

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

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

これにより、hello worldのクリーンなコンパイルが得られます。


私は未来から来ました。お礼を言うようになりました。これは実際に私のために働いた最初のものです。Iveは、これほど難しいHello Worldを経験したことはありません。ありがとうございます。
nVentimiglia 14

17

[プロジェクト]> [プロパティ]> [C / C ++全般]> [プリプロセッサインクルード]> [プロバイダー]に移動し、両方を選択します。

  • 「CDT GCC組み込みコンパイラ設定」
  • 「CDT CROSS GCC組み込みコンパイラ設定」

それらのそれぞれについて、サブプロジェクト「プロジェクト間で共有されるグローバルプロバイダーを使用する」も選択します。

CおよびC ++ Hello Worldを使用してUbuntu 16.04のEclipse 4.8.0でテストされています。


3
... [プロジェクト間で共有されるグローバルプロバイダーを使用する]チェックボックスを
オンにする

@Urhixidurが述べたように、「プロジェクト間で共有されるグローバルプロバイダーを使用する」もチェックする必要がありました。私はこの組み込みのeclipseエラーに対して多数の解決策を試しましたが、これは実際に私のために働いたものです。それらの行は迷惑でした。ありがとう!
CodeGuyRoss 2017

10
  • ファイル>>新規プロジェクトを選択します
  • プロジェクトウィザードで、[ C / C ++ >> C ++ Project]を選択します。
  • 「プロジェクトタイプ」セクションで、「Makefileプロジェクト>> Hello world C ++プロジェクト」を選択します
  • 「ツールチェイン」セクションで、「選択のLinux GCCを

それは問題を解決することができます。(英語が下手で失礼します)


1
私はそれらのことを行いましたが、それでもヘッダーが/ usr / includeにあることを認識しませんでした。
カーディフスペースマン2013

すべてを追加するよりもはるかに簡単です。私はクロスプラットフォームオプションを使用しましたが、これも(Ubuntuで)うまく機能しました
panmari

非常に役立ちます!素晴らしい英語。
AturSams 2016年

既存のプロジェクトでこれをどのように行いますか?
ジェイエルストン2018

4

私はEclipseとCygwinを使用していますが、これは私にとってはうまくいきました:

[プロジェクト]> [プロパティ]> [C / C ++全般]> [プリプロセッサインクルード...]> [プロバイダー]に移動し、[CDT GCC Built-in Compiler Settings Cygwin [Shared]]を選択します。


4

私は働いている複数のクロスコンパイラの設定私はSTDのヘッダファイルのためのさまざまな場所(および他の環境変数)を使用する必要があり、。

解決策は、アクティブな構成を使用するようにインデクサーをセットアップすることでした。
残念ながらEclipseのバグのため、オプションはローカルに保存されないため、Eclipseを再度開いたときに構成を保存する場合はワークスペース構成を使用する必要があります

ウィンドウ->設定-> C / C ++->インデクサー->アクティブなビルド構成を使用

これにより、EclipseはプロジェクトのアクティブなクロスGCC構成で設定された適切なコンパイラーを使用します。


同じ問題があり、ESP8266にクロスコンパイルしました。このページは混雑しすぎているので、自分で理解する必要がありました。
MichaelBöckling2016年

これありがとう。また、ESP32「ESP-IDF」組み込みSDKの異なるバージョン用に複数のクロスコンパイラー構成を作成した後も、この問題が発生しました。インデクサーが正しいヘッダーを取得していませんでした。この設定により、インデクサーがアクティブな構成と同じ環境を使用できるようになり、私の場合は、適切なヘッダーを取得できるようになりました。
davidA 2018年

3

上位回答の注記として、ビルドフォルダーの場所を指定する必要があります。ビルドフォルダーは、プロジェクトを右クリックし、[プロパティ]-> [C / C ++全般]-> [パスとシンボル]を選択して表示されるダイアログから追加できます。

残りの問題は、どのパスを追加する必要があるかです。

コマンドラインアクセス用にgccを正しく設定していて、gccが使用するデフォルトのインクルードパスが何であるかを知る必要がある場合は、それを聞いてください。興味のある言語に応じて、以下を使用します。

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

...これは、gccを呼び出すときに使用されるデフォルトのコンパイラ設定をリストします(このコマンドは、「gcc」が実際にOSXのようにclangのエイリアスである場合にも機能します)。

/dev/null 空のファイルとして使用されている-空のファイルを解析するようにgccに指示しています

-x <language> 言語を指定する拡張子を持つファイルを使用していないため、必要に応じてコンパイルする言語を指定します

-v インクルードパスの出力を含む詳細な出力

-E 前処理のみを実行し、前処理されたファイルを出力します(これにより、gccが空のファイルが正しくコンパイルされないと不平を言うのを防ぎます)

下の方にインクルードディレクトリのリストがあります。

#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.

ここにリストされたディレクトリをリストされた順序でEclipseのパスとシンボルダイアログに入力すると、Eclipse CDTは標準ヘッダーと、おそらくOSに固有の追加ヘッダーを見つけることができるはずです。

(関連する質問に対するdevnullの回答のおかげで。)


とても便利です。
sancho.s ReinstateMonicaCellio

1

ADTで私は次のことを行いました。

  1. プロジェクトを右クリックし、[プロパティ]を選択します
  2. C / C ++ Generalを展開し、Preprocessor Include Paths、Macrosなどを選択します。
  3. CDTユーザー設定エントリを選択
  4. 右側のメニューから[追加...]を選択します
  5. インクルードディレクトリの追加で、プロジェクトパスをファイルシステムパスに変更します。
  6. インクルードファイルを含むディレクトリを参照します。
  7. 必要に応じてかき混ぜて繰り返します

1

通常、Eclipseは標準インクルードファイルを自動的に解決できるはずです。これは、gccを呼び出してその構成を要求することによって行われます。Eclipseがgcc(または少なくともコンパイルに使用するバージョン)を検出していない可能性があります。

プロジェクト設定ですべての標準インクルードパスを指定する代わりに、Eclipseがgccを確実に検出するようにしたい場合があります。Eclipseを起動する前に、gccが見つかったディレクトリをPATH環境変数に追加します。

異なるプロジェクトで異なるコンパイラを使用する場合は、検出オプションを微調整する必要がある場合があります。これらはデフォルトで非表示になっているため、まず[ウィンドウ]> [設定]> [C / C ++]> [プロパティページ設定]> [表示オプション]ページを表示して有効にします。次に、プロジェクトのプロパティのC / C ++ビルド>検出オプションでそれらを見つけることができます。


1

埋め込まれたプロジェクトにEclipseベースのCodeWarrior IDEを使用していますが、ソースアドレスを削除してプロジェクトプロパティ-> C / C ++ General-> Path and Sybols-> Include Directoriesに再度追加することでこの問題を解決しました。これは、「未解決の包含」メッセージを受け取る理由がたくさんあり、解決策もたくさんあることを意味します。


0

パスとシンボルを構成していたエラーは、最初に別の言語のインクルードパスを構成したことです。私はCDTとCygwin gnu C ++を使用しています。したがって、GNU C ++言語でシンボルとパスを構成する必要があります。ここに画像の説明を入力してください


0

また、設定${COMMAND}gccLinux上で

下:

  • 事業
  • プロパティ
  • C / C ++全般
  • プリプロセッサインクルードパス、マクロなど
  • プロバイダー
  • CDT GCC組み込みコンパイラ設定
  • コンパイラー仕様を取得するコマンド

交換:

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

と:

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

これを行わないと、Eclipse stdoutに次のように表示されます。

Unable to find full path for "-E"

そして${HOME}/eclipse-workspace/.metadata/.logショーの下のログ:

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

理由は${COMMAND} ${FLAGS}空で、Eclipseが実行しようとして-E次に来るもの。

設定でCOMMANDFLAGS変数を適切に定義できるかどうか疑問に思いますが、ビルド変数として追加しようとすると、機能しませんでした。

質問のC ++バージョン:Eclipse CDTのC ++ファイルの「未解決の包含:<iostream>」を解決する方法は?

Eclipse 2020-03(4.15.0)、Ubuntu 19.10、および既存のソースを使用したこの最小限のMakefileプロジェクトでテスト済み。


0

コマンドラインからコンパイルするかどうかを確認しますか?Linuxでは、libc-devを適切にインストールしてください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.