2017-07-12 17 views
1

まず、私はCMakeを初めて使う人です。Visual Studio用のCMakeマルチプロジェクトセットアップ2017

私がしたいことは、Linuxのような他のプラットフォームで簡単にプロジェクトを構築するためにVS 2017で直接ソリューションをコンパイルすることからCMakeに切り替えることです。

フォルダ構造:

そして、ここでは私のCMakeLists、ルートプロジェクトのための最初のものである

project 
    |─── CMakeLists.txt 
    |─── bin 
    |  | ─── intermediates 
    |  |  |─── Win32 
    |  |  |  |─── Debug 
    |  |  |  └─── Release 
    |  |  └─── Linux 
    |  |    |─── Debug 
    |  |    └─── Release 
    |  |─── Win32 
    |  |  |─── Debug 
    |  |  └─── Release 
    |  └─── Linux 
    |   |─── Debug 
    |   └─── Release 
    |─── include 
    |─── Project 1 
    |  |─── CMakeLists.txt 
    |  |─── src 
    |  |─── res 
    |  └─── header 
    └─── Project 2 
     |─── CMakeLists.txt 
     |─── src 
     |─── res 
     └─── header 

cmakeのファイルには、もう一つは最初のプロジェクトと第二のプロジェクトのためにあります
# Specify the minimum version for CMake 
cmake_minimum_required(VERSION 3.8.2) 

# Project's name 
project(Project X) 

# Set the C++ Version 
message("!REQUIRED! -- Supported features = ${cxx_std_14}") 
message("Supported features = ${cxx_std_17}") 

set(CMAKE_CXX_STANDARD 14) 
set(CMAKE_CXX_STANDARD_REQUIRED ON) 
set(CMAKE_CXX_EXTENSIONS OFF) 

# Set the output folder where the program will be created 

set(CMAKE_BINARY_DIR ${CMAKE_SOURCE_DIR}/bin) 
set(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR}) 
set(LIBRARY_OUTPUT_PATH ${CMAKE_BINARY_DIR}) 

# Add the modules 
add_subdirectory(Project 1) 
add_subdirectory(Project 2) # depends on Project 1 

1番目と2番目のプロジェクトのCMakeLists.txtは、ファイルの内容と同じです:

# Specify the minimum version for CMake 
cmake_minimum_required(VERSION 3.8.2) 

project(Project 1) 

# In order to find all cpp files automatically for compilation 
file(GLOB CPP_FILES src/*.cpp) 
file(GLOB CPP_FILES header/*.h) 

# Set the version number of the project here 
set(VERSION_MAJOR "0") 
set(VERSION_MINOR "1") 
set(VERSION_PATCH "0") 
set(VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}) 

そして、これは私のVSの設定です:

Output Directory:  $(SolutionDir)bin\$(Platform)\$(Configuration)\ 
Intermediate Directory: $(SolutionDir)bin\intermediates\$(Platform)\$(Configuration)\ 

プロジェクトBプロジェクトAがプロジェクトBは、コンパイルするためには、プロジェクトBにリンクする必要があるだけでlibにある一方で、この場合に実行可能です。

質問:

  • 私はCMakeのにそれらのVisual Studio 2017の設定を適用するにはどうすればよいですか? (どのように私はなどCMAKE_BINARY_DIR設定を構成する必要があります)
  • プロジェクト2は、プロジェクト1に依存し、CMakeのは、これを自動的に処理しますか私はCMakeLists.txtに何かを追加する必要がありますか?

答えて

2

アドレスに複数のポイントがあります。

  1. CMAKE_BINARY_DIRは、すべての意図や目的のために、読み取り専用の変数であり、間違いなくそのように扱われるべきでは。バイナリディレクトリを指定する方法は、(コマンドラインから実行する場合)そのディレクトリでCMakeを実行するか、(CMake GUIを使用する場合)バイナリ/出力ディレクトリとしてそのディレクトリを設定することです。だからあなたの場合には、あなたが欲しいと主張セットアップを達成するために、あなたはこれを行うだろう:

    > cd project/bin 
    > cmake .. -G "Visual Studio whatever" ... 
    

    (「whatever」、もちろん、プレースホルダている)しかし

    、私は強くあなたがお勧めこのようなレイアウトは使用しないでください。はるかに優れたレイアウトは、純粋に外のソース・ビルド、次のようになります。この設定で

    project 
    project/source/CMakeLists.txt 
    project/source/include 
    project/source/... 
    project/build/Win32 
    project/build/Linux 
    

    、あなたはこのように実行したい:

    > cd project/build/Win32 
    > cmake ../../source -G "Visual Studio whatever" ... 
    
  2. との間に矛盾がありますどのようにCMakeでバイナリ出力パスを設定しているのか、またあなたの "VS設定"として何を提示したのでしょうか?"私はあなたの意図された状態は分かりませんが、バイナリがVS設定でリストアップした出力ディレクトリに終わるようにCMakeを設定したい場合は、次のようにします:

    LIBRARY_OUTPUT_PATHため
    set(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR}/${CMAKE_CFG_INTDIR}) 
    

    同上。

  3. は限り中間ディレクトリを行く設定するなど、これはCMakeのは、自分自身を管理して何かで、あなたが本当にこれに影響を与えることができないあなたがが、したいと思います理由。質問です。

  4. プロジェクトの依存関係について:実際にbinarを作成するCMakeコマンドは表示されていません(add_library()/add_executable())またはそれらのプロパティを設定するコマンド。ただし、Project 2で作成された実行可能ファイルがProject 1で作成されたライブラリとリンクするように指定すると、CMakeは依存関係を正しく追跡します。

    target_link_libraries(targetNameOfProject2executable targetNameOfProject1library) 
    
  5. ソースファイルのリストを構築するためにfile(GLOB)を使用することが悪い考えで、CMakeのでは推奨されていることに注意してください:あなたはこのようにそれを指定すると思います。理由は簡単です:ソースファイルを追加してもビルドシステムは再生成されません。つまり、ソースファイルは取得されません。ソースファイルを明示的にリストするのではなく、ファイルを追加すると、それをCMakeListのリスト(またはそのファイルに含まれるファイル)に追加する必要があり、ビルドシステムの再生成がトリガーされます。

  6. Linux用のノート

  7. :Visual Studioのとは違って、Makefileのジェネレータは(とcmakeのの発電機のほとんど実際に)あなたは、各設定のためのビルドシステムを生成しなければならないことを意味 シングル構成の、です。外の源泉セットアップでは、このようにそれを行うだろう:

    > cd project/build/Linux/Debug 
    > cmake ../../../../source -DCMAKE_BUILD_TYPE=Debug ... 
    > cd project/build/Linux/Release 
    > cmake ../../../../source -DCMAKE_BUILD_TYPE=Release ... 
    
+0

**〜1:「純粋にアウト・オブ・ソース・ビルド」だろう、なぜ**あなたは状態でしたより良い? ** 2へ:**私はCMakeの設定をVSの設定と同じにします。 ** To 5:**手動で何百ものファイルを書きたくないので、どのようにしてすべてのソースファイルをコンパイルすることができますか? – ShadowDragon

+1

@ ShadowDragon ** 1 **これは厳密には必要ではありませんが、それはCMakeの推奨動作モードです。 "CMake out-of-source"はgooglableでなければなりません。しかし、ディレクトリが少なくとも別個であるあなたの元のアイデアは合理的にうまくいきます。 ** 2 **答えはそれを示しています。それは実際にあなたの "アンダーソース"設定にも機能します。 ** 5 **リスト( 'set()'呼び出しを 'include()'とは別のファイルに移動して、スクリプトや何かを使って初めて生成することができます。その後、手動で更新してください。 – Angew

関連する問題