2011-12-09 13 views
12

sto usando CMake compilare un mio projets lavoro ecco l'affareCMake: multipli sottoprogetti utilizzando stesso libreria statica

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

quindi voglio poter compilare ogni sottoprogetto singolarmente e costruire sia il client che il server dalla cartella principale.

Diciamo che il client e il server hanno bisogno di libstuff.

Ho provato a utilizzare "add_subdirectory" con il percorso della lib in CMakeLists.txt sia client che server, funziona quando si compila il server o il client, ma se si tenta di eseguire entrambi dalla directory root:

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. 

Quindi sono una specie di nuovo w/cmake e non sono sicuro di cosa dovrei fare, dovrei usare add_dependencies?

Grazie per il vostro aiuto,

+0

cosa intendi con "compilare separatamente"? Se si crea un progetto VS o makefile, è possibile selezionare quale progetto compilare ... – Philipp

risposta

17

Una soluzione semplice è quella di proteggere le chiamate add_subdirectory sia nel client che nel server Elenco CMake file con un if utilizzando un TARGET condizionale, vale a dire:

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

questo modo si evita il sub-directory libplugin vengano aggiunti più di una volta.

+1

Funziona alla grande, grazie :) – Intrepidd

5

vorrei suggerire di mettere tre chiamate add_subdirectory nel CMakeLists.txt root. prima libstuff, poi client e server ....

Imposta il progetto Stuff come se fosse autonomo, ma aggiungi le variabili alla cache di cmake in modo che possa essere "importato" da altri progetti. Quindi, in client e server, puoi fare riferimento al progetto Stuff ... usando la normale chiamata include_directories e target_link_libraries.

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

E poi nel client (e allo stesso modo in Server)

# 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) 

si può quindi "compilazione" solo la directory del client, facendo un passo nella dir Cliente e in esecuzione fare o msbuild lì. In alternativa, è possibile aggiungere un cmake-flag al root-cmakelistt che viene utilizzato per filtrare tra Client, Server o entrambi ...

+0

bene con questa soluzione in può compilare server e client in una riga ma non riesco a compilare un client standalone o un server standalone ... – Intrepidd

+0

Infatti, ma è possibile accedere alla directory Client (o Server) e compilare da lì. –

Problemi correlati