2016-04-27 20 views
5

私のプロジェクトの外にあるClionを含むディレクトリを含めるには、いつでも-I somedirフラグを使用します。Clionにディレクトリを含める

/project 
    CMakeLists.txt 
    /src 
     /Graph 
     Graph.h 
     Graph.cpp 
     /Dijkstra 
     Dijkstra.h 
     Dijstra.cpp 

は私が/srcディレクトリに私のコードをしたい:この時間は、しかし、私がやりたいことは、このような階層構造を持つことです。そして、それだけでなく、例えば、ファイル内にもDijkstra.h私はこのようなGraph.hを含める:#include "Graph/Graph.hと、このようではありません:#include "../Graph/Graph.h

私だけ-I srcフラグを追加した場合、私はDijkstra.hファイル内だと私はGraph.hを含めるしたい場合は、その後、私は私が欲しいものではありませんこれは、#include "../Graph/Graph.hを記述する必要があります。

私はINCLUDE_DIRECTORIES(src)も追加しようとしました。上記の問題を修正しましたが、コンパイルしようとするとリンカーエラーundefined reference to...が発生しました。

だから私はこのような一つ一つのファイルを追加してみました:

set(SOURCE_FILES 
     src/Dijkstra/Dijkstra.h 
     src/Dijkstra/Dijkstra.cpp 
     src/Graph/Graph.h 
     src/Graph/Graph.cpp) 
add_executable(someprojectname ${SOURCE_FILES}) 

をし、それは私がこのようなファイルをインクルードしなければならなかった以前の問題を、持ち帰っ:#include "../Graph/Graph.h"を。

私が望む動作を得るためにこれを正しく行うにはどうすればよいですか?

+0

を、グラフ/ * /含めますSET(DIJKSTRA_INCLUDE_DIR Dijkstra/include /)INCLUDE_DIRECTORIES($ {GRAPH_INCLUDE_DIR} $ {DIJKSTRA_INCLUDE_DIR})を使用して、SET(GRAPH_INCLUDE_DIRグラフ/インクルード)を試してください。 – Varun

+0

まったく疑問はありません。最後の変種を使用して 'include_directory(src/Graph src/Dijkstra)'を追加するとどうなりますか? – fghj

+0

私が提案したやり方は、ディレクトリ構造を作るより良い方法です。あるディレクトリには.cpp、別のディレクトリには.hファイルがあります。これらのファイルを1つのディレクトリに混ぜる理由 – Varun

答えて

5

コマンドINCLUDE_DIRECTORIESは、コンパイルのための任意のソースファイルを追加しません!

代わりに、検索ヘッダーファイルのディレクトリを定義します。 。あなたはどのような場合でもadd_executable()コール内のすべてのソースファイル一覧表示する必要がある

:私はこのグラフ/ SRC/* CPPのようなディレクトリ構造を使用するために、あなたをお勧めし

include_directories(src) 
set(SOURCE_FILES 
    src/Dijkstra/Dijkstra.cpp 
    src/Graph/Graph.cpp) 
add_executable(someprojectname ${SOURCE_FILES}) 
2

更新日: @ Tsyvarevの回答は正しいです。この回答を編集して、間違った部分を削除し、target_include_directories()に関するコメントを残しておきますが、それはTsyvarevの回答に追加して表示する必要があります。

INCLUDE_DIRECTORIES(src)は、その時点から定義されたすべてのターゲットへの検索パスとしてsrcディレクトリを追加します。どのターゲットにもソースを追加しません。検索パスは現在のソースディレクトリとの相対パスになり、CMakeはadd_subdirectory()を介してサブディレクトリに降りるときに適切に調整します。これがうまくいけばいいのに、プロジェクトが大きく複雑になるにつれて、インクルードパス設定をほんの一部のターゲットに適用したいと思うかもしれません。そのため、代わりにtarget_include_directories()を使用します。

target_include_directories(someprojectname "${CMAKE_CURRENT_SOURCE_DIR}/src") 

をこれは、同じ効果を持ちますが、それは追加の使用を制限するだけでsomeprojectnameターゲットへのパスが含まれています。後でインクルードパスを必要としない他のターゲットを定義した場合、追加されません。これにより、深いディレクトリ階層を持ち、ディレクトリ名を別の場所で再利用するなど、予期しないファイルの取得などの状況を防ぐことができます。

target_include_directories()コマンドには、ライブラリターゲットに適用すると、ライブラリにリンクするものにインクルードパスを含めることができるため、追加の利点があります。多くのライブラリを定義してリンクする大きなプロジェクトでは、大きな助けになることがあります。同様の利点を持つ他のターゲット固有のコマンドもあります。 This articleは、あなたに可能なことに対する少しの感触を与えるかもしれません(免責事項:私は記事を書いた)。 target_sources()に焦点を絞っていますが、依存関係を他のターゲットに伝えることについての議論は有用かもしれません。

+0

'include_directories()' **自動的にすべての相対パスを絶対パスに変換します**。詳細については、[documentation](https://cmake.org/cmake/help/v3.0/command/include_directories.html)を参照してください。 – Tsyvarev

+0

本当にあなたは正しいです!そして、私はその質問を誤解しました(include_directories()が使われていなかった)。私はここに私の訂正を見るためにそれを読んだ人々が私の答えを削除することを許可するために私の答えをしばらく置いておきます。訂正ありがとう! –

関連する問題