私はこれが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"ファイルの名前を変更することも可能です。
完全な回答をいただきありがとうございます。問題は私のファイルではなく、システムファイルではなく私のファイルを間違って含む "sched.h"のようなシステムファイルであるため、最初のオプションは私にとっては良くありません。だから、おそらく、include_directoryを使う代わりに、明示的なコンパイラオプションを使うつもりです。 – Boris
私は誤って私のインクルード検索パスに "new"と呼ばれる空のローカルファイルを作成していたので、私はこの質問に来ました。これは、私が使用しているライブラリによっていくつかの#includeレベル離れて使用されたシステムヘッダを先取りしました。なぜ(メッセージは**エラー: 'nothrow'は 'std' **のメンバーではなく、コンパイラのクラッシュが続いた)理由を理解するのに何時間も費やしました。 山括弧で囲まれたファイルがシステムヘッダーからのみ取得されるようにするには、-ioteメカニズム(Visual Studioに相当)が使用できるようです。それがCMakeコマンドを介してサポートされていればうれしいでしょう。 –
Visual Studio(cl.exeフラグ?)にiquoteのようなものがあれば誰でも知っていますか? –