2015-12-23 34 views
9

私はCMakeの初心者です。私の環境には以下のようないくつかのプロジェクトがあります。CMake複数のプロジェクト用のビルドディレクトリ

project 
    |------ CMakeLists.txt (The main Cmake) 
    |------ ProjectA 
    |   |----- .cpp files 
    |   |----- .hpp files 
    |   |----- CMakeList.txt 
    |------ ProjectB 
    |   |----- .cpp files 
    |   |----- .hpp files 
    |   |----- CMakeList.txt 
    | 
    |------ build 
    |   |----- CMakeStuff 
    |------ bin 
    |  |---- executables 
    |------ lib 
    |  |---- libwhatever.a 
    |------ db 
      |---- Database stuff 

上記のように、すべてのプロジェクトに対して1つのビルドディレクトリを使いたいと思います。好ましくは、build/projectAbuild/ProjectBのように複数のサブプロジェクトに分割することができます.1つのプロジェクトを再構築する必要がある場合は、build/Projectファイル全体を削除して、すべてが消えて新しいCmakeが再度ビルドされます。

CMAKEの設定が難しいです。

プロジェクトフォルダのマイオリジナルCMakeList.txt:

cmake_minimum_required(VERSION 3.2.2.) 
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/../lib) 
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/../lib) 
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/../bin) 

project(projectA) 
set(CMAKE_BUILD_TYPE Debug) 

file(GLOB SOURCES "*.cpp") 

add_library(commonmessage SHARED ${SOURCES}) 

install(TARGETS commonmessage DESTINATION ../lib) 

私の質問は以下のとおりです。

A)私は、単一のビルドディレクトリにcmakeのを実行した場合どうなりますか - その可能性と何だろうです正しいCMAKE設定ですか?

B)ProjectAのコンパイルには、ProjectBのファイルが含まれている必要があります - 個々のプロジェクトごとにCMakeLists.txtに設定するにはどうすればよいですか?

C)最後に、すべてのビルドに単一のメイクファイルが必要です。また、各プロジェクトを個別にビルドするオプションも必要です。 1つのビルドディレクトリで可能でしょうか?

ありがとうございます。

答えて

16

まず、あなたが投稿したCMakeコードが、.cppファイルと "projectA"を直接参照しているので、一番上のCMakeList.txtファイルに属しているようには見えません。 慣用的ではないにもいくつかあります。

cmake_minimum_required(VERSION 3.2.2.) 

がなぜここにドットを末尾には? cmakeが文句を言うかどうか分からないが、いずれにしても役に立たない。

set(CMAKE_BUILD_TYPE Debug) 

しないでください。代わりに-DCMAKE_BUILD_TYPE=Debugコマンドラインフラグを使用してcmakeを起動するか、ccmakeまたはGUIを使用するか、CMakeCache.txtファイルを編集します。

file(GLOB SOURCES "*.cpp") 

どちらもしないでください。 globakeは新しく追加されたファイルや削除されたファイルを自動的に検出しないので、CMakeのソースファイルを明示的にリストすることをお勧めします。しかし、一部の人々は反対するかもしれません。

は、今話題の中心地のために、ここで物事が通常行われる方法である。

トップCMakeLists。TXTファイル:

cmake_minimum_required(VERSION 3.2.2) 
project(globalProject) 

add_subdirectory(projectA) 
add_subdirectory(projectB) 

PROJECTA CMakeLists.txtファイル(PROJECTAを仮定すると、実行可能である):

add_executable(projectA file1.cpp file2.cpp ...) 
include_directories(${CMAKE_SOURCE_DIR}/projectB) # include files from ProjectB 
target_link_libraries(projectA projectB) 

install(TARGETS projectA RUNTIME DESTINATION bin) 

ProjectBのCMakeLists.txtファイル(ProjectBのライブラリーであると仮定):

add_library(projectB file1.cpp file2.cpp ...) 

install(TARGETS projectB 
    LIBRARY DESTINATION lib 
    ARCHIVE DESTINATION lib) 

この設定では、cmake -DCMAKE_INSTALL_PREFIX=..のコマンドライン呼び出しで指定された場所にbinとlibを作成するには、make installの手順が必要です。 makeはビルドディレクトリから実行されます)。

また、この設定では、スタティックライブラリまたは共有ライブラリをビルドするかどうかを選択できます。-DBUILD_SHARED_LIBS=ONを使用します。両方を構築するには、2つの異なる名前の2つのadd_libraryコールを持つ必要があります.1つはSTATIC、もう1つはSHAREDです。

この作業を行うために必要な手順をまとめると:

$ mkdir build && cd build 
$ cmake .. -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=.. -DBUILD_SHARED_LIBS=ON 
$ make 
$ make install 

あなたは再利用のためのスクリプトにこれらのコマンドを入れることができます。

今、あなたの質問に答えることができる:

A)には、上記のコードを参照して、可能と推奨され、唯一のビルドディレクトリが必要です。

B)はPROJECTA/CMakeLists.txtのコードを参照してください、あなたはinclude_directories()

C)はい、それは可能であるが呼び出す必要があります。あなたのプロジェクトの各ターゲットは、ビルドディレクトリからmakeとターゲット名を使用して個別にビルドすることができます:make projectBmake projectA

+0

助けてくれてありがとう...私はlibとbinファイルをターゲットフォルダ'make install 'する必要はありませんか? – Mendes

+0

'CMAKE _ * _ OUTPUT_DIRECTORY'変数を使用することは可能ですが、いくつかの設定(DebugとRelease、別のコンパイラなど)を持つ複数のビルドディレクトリがあるかもしれないので、これを行うことはお勧めしません。コンパイル時にファイルを上書きせずにそれらを並行してテストすることができます。なぜあなたのプロジェクトのルートにbin/libが必要ですか? – SirDarius

+0

良い点。 'bin'はすべての実行ファイルがインストールされる場所です。 'lib 'はすべてのライブラリを保持します。 – Mendes

1

A)N個のプロジェクトに対して1つのCMakeLists.txtを実行できます。ライブラリを定義するときには、cmakeで定義された実行可能ファイル(add_executableとtarget_link_librariesを参照)で使用できます。

B)は、あなたがあなたのcmakelists.txtファイルのターゲットの一つだけのためのMakefileを生成するcmake --target targetを呼び出すことができるようです)target_include_directories

Cを参照してください。

関連する問題