2012-03-27 15 views
2

ソースツリー内のファイル名は "time.h"で、システム "time.h"と同じです。これは変更できません。私はcmakeの問題に遭遇しました.include_libraryオプションを使用すると、-Iフラグに変換されます。これは、私のカスタム "time.h"が<>を含む場合でもシステムtime.hよりもprcedenceを取ることを意味します。これは決まったものではありません。cmake include_directories order after AFTER/BEFORE

私はinclude_directories(AFTER dir1 dir2)を使用しようとしましたが、期待された-idオプションの代わりに-Iオプションを生成しました。

答えて

3

私はこれがCMakeの問題だとは思わない。 gccは#includeで引用符や角括弧を使用するかどうかにかかわらず、include_directoriesのさまざまなオプションにかかわらず、システムよりも前に常に "time.h"が見つかると思います。 cmakeののinclude_directoriesだけのgccコマンドに記載されているディレクトリの順序に関係のgcc documentation

AFTERオプションで-I-isystemのエントリを参照してください、それはGCCの-idirafterフラグとは関係ありません。

システムファイルと同じ名前の独自のファイルを持つことは素晴らしい計画ではありませんが、手が縛られている場合は、自分のパスをより完全に修飾することによってtime.hの名前を変更することなくこの問題を回避できますむしろ

CMakeLists.txt: include_directories(${PROJECT_SOURCE_DIR}/src) 

header file:  #include <time.h> // we want but don't get system one 
       #include "time.h" // we want and get own custom one 

代替オプションは使用(あなた自身のためのシステムTIME.Hと引用符のために角括弧を使用して)あなたの現在の#includeのセットアップに固執していないことであろう多くの

CMakeLists.txt: include_directories(${PROJECT_SOURCE_DIR}) 

header file:  #include <time.h>  // we want and get system one 
       #include "src/time.h" // we want and get own custom one 


のようなものinclude_directoriesはCMakeLists.txtにまったくありません。代わりに、私はあなたのようなものに置き換えることができると思う:-iquoteを使用して

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -iquote ${PROJECT_SOURCE_DIR}/src") 

-idirafterで指定したディレクトリ(この場合には、誤って)システムディレクトリとして扱われ、そのように持っているので、おそらく-idirafterより良いオプションです警告は、抑制など

あなたはこの選択のために行く場合、それはより正常なinclude_directoriesコマンドを使用してバック戻る将来のリファクタリングを避けるために何include_directoriesが存在しない理由を説明するCMakeLists.txtのコメントはおそらく価値があります。

すべての可能な限り、あなたの "time.h"ファイルの名前を変更することも可能です。

+0

完全な回答をいただきありがとうございます。問題は私のファイルではなく、システムファイルではなく私のファイルを間違って含む "sched.h"のようなシステムファイルであるため、最初のオプションは私にとっては良くありません。だから、おそらく、include_directoryを使う代わりに、明示的なコンパイラオプションを使うつもりです。 – Boris

+0

私は誤って私のインクルード検索パスに "new"と呼ばれる空のローカルファイルを作成していたので、私はこの質問に来ました。これは、私が使用しているライブラリによっていくつかの#includeレベル離れて使用されたシステムヘッダを先取りしました。なぜ(メッセージは**エラー: 'nothrow'は 'std' **のメンバーではなく、コンパイラのクラッシュが続いた)理由を理解するのに何時間も費やしました。 山括弧で囲まれたファイルがシステムヘッダーからのみ取得されるようにするには、-ioteメカニズム(Visual Studioに相当)が使用できるようです。それがCMakeコマンドを介してサポートされていればうれしいでしょう。 –

+1

Visual Studio(cl.exeフラグ?)にiquoteのようなものがあれば誰でも知っていますか? –