2011-12-09 21 views
12

私は私の仕事のprojetsの1をコンパイルするcmakeのを使用しています、ここで取引がCMakeの:同じ静的ライブラリを使用して、複数のサブプロジェクト

ある
- 
    client/ 
    CMakeLists.txt 
    server/ 
    CMakeLists.txt 
    libs/ 
    libstuff/ 
     CMakeLists.txt 
    CMakeLists.txt 

だから私が個別に各サブプロジェクトをコンパイルすることができ、そして構築したいですクライアントとサーバーの両方をルートフォルダから削除します。

クライアントとサーバーにlibstuffが必要だとします。

クライアントとサーバーCMakeLists.txtの両方でlibのパスに「add_subdirectory」を使用しようとしましたが、サーバーまたはクライアントをコンパイルするときに動作しますが、ルートディレクトリから両方を実行しようとすると動作します。

CMake Error at common/libplugin/CMakeLists.txt:33 (ADD_LIBRARY): 
    add_library cannot create target "plugin" because another target with the 
    same name already exists. The existing target is a static library created 
    in source directory "/home/adrien/git/r-type/common/libplugin". See 
    documentation for policy CMP0002 for more details. 

だから私は新しいw/cmakeの種類だと私は何をすべきか分からない、私はadd_dependenciesを使用する必要がありますか?私はあなたのルートCMakeLists.txtに3本のadd_subdirectory電話を入れてお勧めしますあなたの助けを

おかげで、

+0

「別々にコンパイルする」とはどういう意味ですか? VSプロジェクトやmakefileをビルドすると、コンパイルするプロジェクトを選択することができます。 – Philipp

答えて

17

単純な解決策は、クライアントとサーバーCMakeリストの両方でadd_subdirectoryコールをガードすることですすなわち、TARGET条件を使用してif持つファイル:

if (NOT TARGET plugin) 
    add_subdirectory("${CMAKE_SOURCE_DIR}/common/libplugin") 
endif() 

これを複数回追加されlibpluginサブディレクトリを防ぐことができます。

+1

素晴らしい作品、ありがとう:) – Intrepidd

5

。 libstuff、次にクライアントとサーバー....

Stuffプロジェクトをスタンドアロンとして設定しますが、他のプロジェクトで「インポート」できるように変数をcmakeキャッシュに追加します。次に、クライアントとサーバーで、通常の呼び出しinclude_directoriestarget_link_librariesを使用して、スタッフプロジェクトを参照することができます。

など。 libstuff中...

# libstuff CMakeLists 
project(Stuff) 
# ... whatever you need here: collect source files, ... 
add_library(LibStuff ${Stuff_Sources}) 
# Then, define a very useful variables which gets exported to the cmakecache and can be 
# used by other cmakelists 
set(STUFF_INCLUDE_DIRS ${Stuff_SOURCE_DIR} CACHE STRING "Include-dir for Stuff." FORCE) 

して、クライアントでの(と同様にサーバで)

# client CMakeLists 
project(Client) 
# refer to Stuff-includes here... 
include_directories(${STUFF_INCLUDE_DIRS}) 

add_executable(Client client.h client.cpp main.cpp) # 
target_link_libraries(Client LibStuff) 

その後、クライアントのディレクトリに足を踏み入れると作るか、または実行することによって、唯一のクライアントのディレクトリを「コンパイル」することができますそこにmsbuild。または、クライアント、サーバー、またはその両方の間でフィルタするために使用されるroot-cmakelisttにcmake-flagを追加することができます。

+0

このソリューションでは、サーバとクライアントの両方をコンパイルできますが、スタンドアロンクライアントまたはスタンドアロンサーバをコンパイルできません... – Intrepidd

+0

確かに、クライアント(またはサーバ)ディレクトリに入り、そこからコンパイルすることができます。 –

関連する問題