103

g++フォームのエラーが表示されます:

foo.cc:<line>:<column>: fatal error: <bar>: No such file or directory
compilation terminated.

を使用してCプログラムをコンパイルする場合も同じgccです。

何故ですか?


注意:この質問はこれまで何度も質問されてきましたが、毎回質問者の状況に固有のものでした。この質問の目的は、他の人が、一度限りの複製として閉じることができるという質問をすることです。FAQ。_

4

3 に答える 3

137

コンパイラが。という名前のファイルをコンパイルしようとしましたfoo.cc。行番号を押すlineと、コンパイラは次のことを検出します。

#include "bar"

また

#include <bar>

次に、コンパイラはそのファイルを見つけようとします。このため、ディレクトリのセットを使用して調べますが、このセット内にはファイルはありませんbar。includeステートメントのバージョン間の違いの説明については、ここを参照してください。

コンパイラにそれを見つける方法を伝える方法

g++オプションがあります-I。コマンドラインにインクルード検索パスを追加できます。ファイルが、に関連する、barという名前のフォルダにあると想像してください(が配置されているディレクトリからコンパイルしていると仮定します)。frobnicatefoo.ccfoo.cc

g++ -Ifrobnicate foo.cc

さらにインクルードパスを追加できます。あなたが与えるそれぞれは、現在のディレクトリに相対的です。Microsoftのコンパイラには、同じように機能する相関オプション/Iがあります。またはVisual Studioでは、フォルダはプロジェクトのプロパティページの[構成のプロパティ]-> [C /C++]->[一般]->[追加のインクルードディレクトリ]で設定できます。

barここで、次のように、異なるフォルダに複数のバージョンがあると想像してください。


// A/bar
#include<string>
std::string which() { return "A/bar"; }

// B/bar
#include<string>
std::string which() { return "B/bar"; }

// C/bar
#include<string>
std::string which() { return "C/bar"; }

// foo.cc
#include "bar"
#include <iostream>

int main () {
    std::cout << which() << std::endl;
}

の優先順位#include "bar"は左端です:

$ g++ -IA -IB -IC foo.cc
$ ./a.out
A/bar

ご覧のとおり、コンパイラが、、およびを調べ始めるA/B/C/最初または左端のヒットで停止しました。

これは、include <>との両方の形式に当てはまりますincude ""

#include <bar>との違い#include "bar"

通常、は#include <xxx>最初にシステムフォルダを#include "xxx"調べ、は現在のフォルダまたはカスタムフォルダを最初に調べます。

例えば:

プロジェクトフォルダに次のファイルがあるとします。

list
main.cc

main.cc

#include "list"
....

このため、コンパイラはプロジェクトフォルダ内#includeのファイルを作成します。これは、現在コンパイルされており、そのファイルが現在のフォルダにあるためです。listmain.cclist

しかしとmain.cc

#include <list>
....

次にg++ main.cc、コンパイラは最初にシステムフォルダを調べます。これ<list>は標準ヘッダーであるため、C++プラットフォームに標準ライブラリの一部として付属している#includeという名前のファイルになります。list

これはすべて少し単純化されていますが、基本的な考え方がわかるはずです。

<>/ ""-prioritiesとの詳細-I

gcc-documentationによると、の優先順位include <>は、「通常のUnixシステム」では次のとおりです。

 /usr/local/include
 libdir/gcc/target/version/include
 /usr/target/include
 /usr/include

C ++プログラムの場合、最初に/ usr / include / c ++/versionも調べます。上記では、targetは、GCCがコードをコンパイルするように構成されたシステムの正規名です。[...]。

ドキュメントには次のようにも記載されています。

-Idirコマンドラインオプションを使用して、このリストに追加できます。-Iで指定されたすべてのディレクトリは、デフォルトのディレクトリの前に、左から右の順序で検索されます。唯一の例外は、デフォルトでdirがすでに検索されている場合です。この場合、このオプションは無視され、システムディレクトリの検索順序は変更されません。

例を続けるには#include<list> / #include"list"(同じコード):

g++ -I. main.cc

#include<list>
int main () { std::list<int> l; }

実際、システムに含まれる-I.フォルダよりもフォルダが優先.され、コンパイラエラーが発生します。

于 2012-10-16T16:17:04.333 に答える
0

また、ヘッダーファイル名に「struct」または「Struct」の文字を含めると、コンパイラが同じ「no suchfileordirectory」エラーをスローするというコンパイラのバグがあるようです。

于 2021-10-25T19:04:53.197 に答える
-3

これは私にとってはうまくいきます、sudo apt-get install libx11-dev

于 2020-12-02T16:46:43.360 に答える