2011-12-09 77 views
12

我使用cmake編譯我的工作projets之一,這裏的多個子項目是交易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?

感謝您的幫助,

+0

你是什麼意思與「分開編譯」?如果你建立一個VS項目或生成文件,你可以選擇要編譯的項目... – Philipp

回答

17

一個簡單的解決方案是在客戶端和服務器CMake列表中保護add_subdirectory調用使用TARGET有條件的,即,具有if文件:

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

這防止libplugin子目錄被添加超過一次。

+1

很好,謝謝:) – Intrepidd

5

我建議把你的根的CMakeLists.txt 3個add_subdirectory電話。 libstuff首先,然後客戶端和服務器....

設置Stuff項目就好像它是獨立的,但添加變量到cmake緩存,使其可以被其他項目「導入」。然後,在客戶端和服務器中,您可以使用普通電話include_directoriestarget_link_libraries參考Stuff項目。

E.g.在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) 

然後你可以「編譯」只有客戶目錄,步入客戶端目錄,並運行make或那裏有msbuild。或者,您可以將cmake標誌添加到用於在客戶端,服務器或兩者之間進行過濾的root-cmakelistt ...

+0

以及此解決方案可以編譯連續的服務器和客戶端,但我無法編譯獨立的客戶端或獨立的服務器... – Intrepidd

+0

事實上,您可以進入客戶端(或服務器)目錄並從那裏編譯。 –