2011-08-03 9 views
59

私はディレクトリを、JavaのパッケージやPHPのディレクトリを使用する方法のような組織的要素として使用したC++プロジェクトを持っています。ディレクトリは自立的要素ではなく、プロジェクトの全体を組織し、ソースに圧倒されないようにするためのものです。これに対処するためにCMakeLists.txtファイルをどのように構築できますか?ディレクトリライブラリを作成することは、相互に依存し、そのように使用されることは意図されていないので、ここに収まらないように見えます。複数の相互依存するサブディレクトリを持つC++プロジェクトをビルドするにはどうすればよいですか?

関連する問題として、私はCMakeの複数のサブディレクトリについて見た例の多くは、それほど多くはありません。問題があった。どのファイルがどのディレクトリに依存しているかを判断するために自分のソースファイルを整理していないと、ちょうど/src/の下にあるすべてのディレクトリを潜在的なインクルードディレクトリとして設定し、実際に依存しているものを取り除くことができますか?

--src 
    --top1 
    --mid1 
     --bot1 
     --src1.cpp 
     --hdr1.h 
     --bot2 
     --src2.cpp 
     --hdr2.h 
    --mid2 
     --bot3 
     --src3.cpp 
     --src4.cpp 
     --hdr3.h 
    --top2 
    --mid3 
     --src5.cpp 
     --hdr4.h 

ようになど:

は、ここでの構成例です。このような構造を処理するために私のCMakeLists.txtファイルをどのように構築すればよいですか?

+1

あなたは絶対にCMakeを使用する必要がありますか? –

+0

1.)ジェネレータを使用していますか? 2)本当にCMakeは何に頼っているのか理解しておくべきだと思いますか?お互いに独立したモジュール(例えば、mid1、mid2、top2)を定義することが可能であると思います。 3.)#hdr2.hなどの#includeを含むか、のようなものですか? – Philipp

+0

@benoitそうは思いませんが、それは私が現在使っていることです。私はAutomakeを使いたくないのですが、私のビルドがちょうど複雑でないときに、ビルドシステムを学ぶための努力のようです。 –

答えて

50

プロジェクト内のディレクトリ構造は、ファイルを整理しておくためのものであるため、CMakeLists.txtディレクトリにあるすべてのソースファイルを自動的に検索し、すべてのディレクトリをヘッダファイルを含むインクルードディレクトリとして追加する方法がありますそれらの中に。以下CMakeのファイルには、出発点として役立ち得る:

cmake_minimum_required(VERSION 3.0) 

project (Foo) 

file(GLOB_RECURSE Foo_SOURCES "src/*.cpp") 
file(GLOB_RECURSE Foo_HEADERS "src/*.h") 

set (Foo_INCLUDE_DIRS "") 
foreach (_headerFile ${Foo_HEADERS}) 
    get_filename_component(_dir ${_headerFile} PATH) 
    list (APPEND Foo_INCLUDE_DIRS ${_dir}) 
endforeach() 
list(REMOVE_DUPLICATES Foo_INCLUDE_DIRS) 

add_executable (FooExe ${Foo_SOURCES}) 
target_include_directories(FooExe PRIVATE ${Foo_INCLUDE_DIRS}) 
file(GLOB_RECURSE ...

2つのコマンドは、ソースおよびヘッダファイルのセットを決定します。 foreachループは、すべてのヘッダーファイルのリストからインクルードディレクトリのセットを計算します。

ソースファイルの集合を計算することの1つの欠点は、ソースファイルに新しいファイルが追加されたときにCMakeが自動的に検出しないことです。手動でビルドファイルを再作成する必要があります。

+0

私はすでに何か似たような試みをしていましたが、include_directoriesのロジックが違っていました(悲惨なことに失敗しました)。私はこれを行かせます。 –

+15

ありがとうございます!私はこれを見つけることがとても難しいとは考えられません。サブディレクトリにソースファイルを編成する人はいませんか? – Cygon

+2

@Cygon - 明らかにそうではありません。 :-) –

2

私はCMakeの専門家ではありませんが、他の回答がないので、ドキュメントを見て行きましょう。さまざまなディレクトリにソースファイルとインクルードファイルを整理するのはかなり一般的です。 http://www.cmake.org/cmake/help/cmake-2-8-docs.html#command:include_directories

だから、のようなもの:それはヘッダファイルを見つけることができますので、これらはコンパイラに渡され

include_directories("src/top1/mid1/bot1" "src/top1/mid1/bot2/" ...) 

意志それはCMakeのように見えます

は、ディレクトリを含めるのリストを与えることができます各ソースファイルに対して渡されます。だからあなたのソースファイルのいずれかがヘッダーファイル(私はあなたが求めていると思います)を含めることができるはずです。それに似て

あなたはadd_executableコマンドですべてのソースファイルを一覧表示することができるはずです。

add_executable(name "src/top1/mid1/bot1/src1.cpp" "src/top1/id1/bot2/src2.cpp" ...) 

だから、これは、構築するために、すべてを取得する素朴な方法だろう。各ソースファイルはコンパイルされ、これらすべてのディレクトリのヘッダーが検索され、オブジェクトファイルがリンクされます。これを単純化する方法があれば、それほど多くのインクルードフォルダを必要としないようにしてください。おそらく、すべてのソースファイルによって参照される必要がある共通ヘッダーファイルがいくつかあります。状況がさらに複雑になる場合は、サブ階層をライブラリなどに組み込むことができます。また、ソースファイルとヘッダーを分離することも検討してください(srcやincludeなど)。

関連する問題