2012-03-12 9 views
11

CMakeで再生を開始します。必要なときに独立して複数のライブラリと実行可能ファイルのCMakeLists.txtファイル

  • ビルドそれぞれlibとexeファイル:私はしたいと思います

    /DEV 
    |-- lib1 
         | CMakeLists.txt 
    
    |-- lib2 
         | CMakeLists.txt 
    
    |-- exe1 
         | CMakeLists.txt 
    
    /BUILD 
    |-- lib1 
    |-- lib2 
    |-- exe1 
    
    /INSTALL 
    |-- include 
    |-- lib 
    |-- bin 
    

    :私のようなものを持っています。 (だから、各libとexeのCMakeLists.txtファイルを追加しなければならないと思います)。

  • ビルド時には、includeとlibディレクトリはINSTALLディレクトリを参照する必要があります。 (良い考えですか?)
  • ビルド時に、他のlibに依存関係を追加し、最新でない場合にはそれらを再構築します。

私はどこから始めるべきかわからない。必要なときに独立して...

+0

:単一LIBを構築し、exeファイルは独立しても、そのLIB用に生成されたビルドディレクトリにcd'ingによって行うことができ、および/ MSBuildのを作る呼び出します。例えば。そのlibに/ exeファイルがプロジェクト()コマンド –

答えて

11

ターゲットを個別に構築するために個々のCMakeLists.txtは必要ありません。あなたが1つのトップレベルCMakeLists.txtを持っていると言う:

ADD_LIBRARY(lib1 ${all_lib1_files}) 
ADD_LIBRARY(lib2 ${all_lib2_files}) 
ADD_EXECUTABLE(exe1 ${all_exe1_files}) 
TARGET_LINK_LIBRARIES(lib2 lib1) # lib2 now depends on lib1 
TARGET_LINK_LIBRARIES(exe1 lib2) # exe1 now depends on lib2 and lib1 

次に、あなただけのあなたは、ターゲットごとに個別のCMakeLists.txtファイルを持つことで同じことを達成することができますなど、make lib1またはmsbuild lib1.vcxprojを実行して、LIB1構築することができます - それは次第ですそれが価値があると思うならば

プロジェクトがFIND_LIBRARYまたはFIND_PACKAGEを使用してこれらの目標をインポートした場合、彼らが最新でないなら、それらが再構築されることはありません。最終的に、古い依存関係を自動的に再構築したい場合、CMakeに依存ターゲットのソースとルールを知らせる必要があります。つまり、CMakeLists.txtファイルにADD_LIBRARYまたはADD_EXECUTABLEを使用してターゲットを追加する必要があります。

したがって、CMakeはターゲットをリンクするときにインストールされた場所ではなくlibs/exesビルドの場所を暗黙的に使用するので、INSTALLディレクトリを参照する必要はありません(INSTALLのコマンドを除く)。優秀な答えarrowdodgersに加えて

+0

は私がトップレベルでCMakeLists.txtファイルを置くか、私は、各実行可能フォルダにこのようなファイルを置くことができなければなりません。私には、より良い解決策だ?それとも、いくつかの「再帰的な魔法」私はそこにあります考慮すべき?ありがとう! – Korchkidu

+2

それはあなたのプロジェクトのルートでメインCMakeLists.txtを持つことが普通です。あなたがしたい場合は、各exeファイルのフォルダにCMakeLists.txtファイルを追加することができ、その後、ちょうど 'INCLUDE'これらの各。' INCLUDE'コマンドをインラインで実行するので、これらの従属CMakeLists.txtファイルを完全にスタンドアロンにする必要はありません(つまり、 'PROJECT'コマンドなどは必要ありません)。プロジェクトの一部を削除し、トップレベルのファイルをきれいに保ちます。それぞれの ''ちょうどSET(all_exe1_files ...) '、' ADD_EXECUTABLE(EXE1 $ {all_exe1_files}) 'と' SET_TARGET_PROPERTIES(EXE1を...)持っている可能性があります。 – Fraser

+0

優秀!どうもありがとう! – Korchkidu

3

構築するために、各libとexeファイルを助けてください。

だけadd_executable()またはadd_library()呼び出しにEXCLUDE_FROM_ALLキーワードを追加します。建物

含んおよびlibディレクトリは、あなたがinclude_directories()link_directories()に追加することを意味referencingことであれば、それは素晴らしいではありません ディレクトリ

をINSTALL参照する必要があります。ユーザシステム上の必要なファイルの場所を主張しない方が良いでしょう。適切な方法は、find_package()find_library()またはfind_file()を使用して必要なインクルードとライブラリを見つけることです。最初の機能を使用する場合は、FindYourLib.cmakeと書いてライブラリ自体にインストールする必要があります。

構築する場合、他のlibに依存関係を追加し、これはCMakeので自動的に行われていない

日まで

場合は、それらを再構築します。依存関係は、add_dependencies()関数で追加することも、暗黙的にtarget_link_libraries()を追加することもできます。

+0

で独自のCMakeLists.txtを持っている場合はVisual Studioに、cmakeのは、「それは今うれしいです」それぞれのlib/exeファイルのためのソリューションファイルを生成します。それはタイプミスか何か?また、INSTALLディレクトリのlibsは私たち自身のもので、開発者だけが利用できます。私たちはそれらを配布するつもりはありません。これらは、パッケージによって再配布される実行可能ファイルに静的にリンクされています。だから、実際にはライブラリをシステムにインストールするのではなく、それらのライブラリを別々に保つことを好みます。もっと理にかなっていますか?ご回答有難うございます! – Korchkidu

+1

インポートされた依存関係は再構築されません。 CMakeのドキュメントから: "IMPORTEDターゲットに追加された依存関係は、ターゲット自体がビルドしていないので、代わりに推移します。"また、 'EXCLUDE_FROM_ALL'はターゲットを独立してビルドすることとは何の関係もなく、' ALL_BUILD' CMakeターゲットの一部としてターゲットがビルドされるのを止めるだけです。最後に、あなたに別のcmakeのプロジェクトを含めるための適切な方法は、依存関係に 'INSTALL(EXPORT ...'コマンドを使用することで、その後、単に 'あなたにエクスポート' .cmake'ファイルをINCLUDE' 'cmakeのを実行します。 - 詳細については、-help-コマンドINSTALL'。 – Fraser

関連する問題