2017-01-01 9 views
1

私は他の人が書いたライブラリを使用しています。ヘッダーまたはソースファイル内で使用されるすべてのインクルージョンは、標準ライブラリファイルではなく、 ""の代わりに "<>"の形式になります。それらを認識し、エラーを返す「ファイルが見つかりません」私のコンパイラは""の代わりに ">"を使用する方法

は、問題の例は以下のヘッダ内にあるされていません。

#ifndef _ga_ga_h_ 
#define _ga_ga_h_ 

// Make sure that we get the configuration into each of the galib components 
// that will be used. 
#include <ga/gaconfig.h> 

// These are the headers for all of the genetic algorithm classes. 
#include <ga/GASimpleGA.h> 
#include <ga/GASStateGA.h> 
#include <ga/GAIncGA.h> 
#include <ga/GADemeGA.h> 
#include <ga/GADCrowdingGA.h> 

// Here we include the headers for all of the various genome types. 
#include <ga/GA1DBinStrGenome.h> 
#include <ga/GA2DBinStrGenome.h> 
#include <ga/GA3DBinStrGenome.h> 
#include <ga/GABin2DecGenome.h> 

私は、#include「GAを使用して私のプログラム内でそのヘッダが含まれます。 h "ですが、ライブラリ内のすべてのヘッダー/ソースファイル内で変更するのは非常に困難です。

コンパイラが<を "あたかも"のように使用する方法はありますか? プロジェクトのプロパティ(Visual Studioを使用しています)から "インクルードディレクトリを追加"にパスを追加しようとしましたが、多くのインクルードのエラーは消えましたが、約30は持続しました。奇妙なことに、彼らは "c1xx"というファイルにありますが、私はそのファイルを持っていません!

おかげで、

+0

コンパイラのヘッダー検索パスにこれらのヘッダーのパスを追加できます。それがうまくいくかどうかは実装定義です。 – Unimportant

+0

インクルードファイルのデフォルトの検索パスを設定または追加する方法は、コンパイラと環境によって異なります。コマンドラインからGCCとClangを使って '-I'(大文字のi)オプションを使います。 –

+0

どのコンパイラを使用していますか? – pstrjds

答えて

4

定義は、/ usr /「(Unixライクなシステム上)及び」ローカルヘッダに使用されているが含まれるよう<>は通常の場所で見つかった「システム」ヘッダファイルに使用されていることを多少ありますファイル。コードをコンパイルするときに、ヘッダファイルを含む追加のディレクトリの場所を指定することができます。 GCCを使用する場合は-Iオプションを使用します。必要な設定については、コンパイラのドキュメントを確認してください。

LinuxとGCCでは、 "ga"ディレクトリが/ usr/local/include/gaにある場合は、cc -I/usr/local/includeを使用します。

+0

にヘッダをコピーし、cやC++と関係がない場合は '<>'の代わりに '' ''を使うことができますコード。リンク時に名前のマングリングが問題になることがあります。 – danishansari

+0

あなたの答えをありがとう。申し訳ありません、私は騒ぎです、もう少し詳しくお聞かせください。私のソースでは、次のようにファイルをインクルードします: – Peet

+0

#include "ga \ ga.h"そのファイルの中に<> ...これらすべてのインクルージョンがありますので、このようにインクルードする必要があります:#include " - l \ ga \ ga.h "? – Peet

-2

あなたはコマンドラインで実行する場合:

echo | gcc -v -E -x c++ - 

あなたは、デフォルトで出力が得られますが、C++のディレクトリが含まれています。それらは組み込みのシステムのインクルード検索パスです。

g++ -I/some/dir -o foo foo.cppを指定してコンパイルする場合は、追加のインクルード検索パス()をコンパイルに追加します。

上記の場所のヘッダーは、#include <header>のようなインクルードディレクティブで見つけることができます。 #include "header"ディレクティブでも、これらの場所にヘッダーを見つけることができますが、次の場合にはより適切です。あなたが#include "header"を行うと、それfoo.cppディレクトリが検索パスにあるかどうかにかかわらず、それ含まれている場合

、あなたのコンパイラは、最初のfoo.cppのディレクトリへの「ヘッダ」相対を見つけようとします。見つからない場合は、インクルード検索パスを検索します。このため、特定の.cppファイルに結びついているヘッダーとの関連性が高く、コンパイルに追加のインクルード検索パスを追加したり、インクルードディレクティブを相対パスで使用することは望ましくありません。

#include <header>を使用する場合、headerは、インクルード検索パスsystemまたは/some/dirから-Iフラグの一部である必要があります。 headerfoo.cppを基準にしていて、検索パスではない場合、コンパイルは失敗します。

#include "header"を使用し、headerがインクルード検索パスに含まれていない場合でも、それはfoo.cppの相対位置にあります。

+2

質問はVisual Studioについてですが、gccではありません。そして、gccはC++を正しく処理しません。そのためにはg ++を使うべきです。 –

+0

@PeteBecker yo C++エキスパート。私は 'gcc -v -E -x C++-'にgccを使用しました。これはC++用のヘッダのリストを取得するのに正しいもので、g ++を他の場所で使っていました。 –

+1

@PeteBeckerそして質問はビジュアルスタジオとしてフラグが立てられておらず、彼はそれを使っています。私が説明したことはclangにも当てはまります(ただし、ヘッダーのリストを取得するのと同じ方法で動作しますが、clangではなくclangを使用します)。そして彼がmsvcにそれを適用すれば、その考え方は同じです。 –

関連する問題