2012-07-02 1 views
8

J'ai trois fichiers:CMake créer un objet partagé

lib.c lib.h => Ils doivent être construits en tant que fichier .so
client.c => Cela devrait être construit comme un exécutable.
A l'intérieur du client.c j'inclure le fichier lib.h afin d'obtenir les déclarations des fonctions définies sous lib.c

Quelqu'un peut me dire le fichier CMakeLists exact que je devrais utiliser pour que la zone source est concis avec les fichiers temporaires de Cmake et les binaires et les bibliothèques (.dlls dans le cas de Windows je crois) générés dans des répertoires de compilation et binaires séparés?

Répondre

4

Cmake construit sur les répertoires de construction séparés par défaut (je n'ai pas testé cet exemple):

PROJECT(myproject) 
CMAKE_MINIMUM_REQUIRED(VERSION 2.8) 

SET(mylibSRCS lib.c) 
SET(myprogSRCS client.c) 

ADD_LIBRARY(mylib ${mylibSRCS}) 
ADD_EXECUTABLE(myprog ${myprogSRCS}) 

TARGET_LINK_LIBRARIES(myprog mylib) 

Vous faites:

mkdir build 
cd build 
cmake .. 
make 

Tout serait sous construction.

+0

est-il un moyen de faire de la construction toujours dans un nouveau répertoire sans exécuter ces commandes shell? J'ai googlé mais je n'ai pas trouvé de liens utiles. –

+0

http://stackoverflow.com/questions/11143062/getting-cmake-to-build-out-of-source-without-wrapping-scripts/11144109#11144109 – Fraser

+0

Oui. Vous pouvez 'mkdir build & cd build & cmake .. & make'. Si vous avez besoin de super-nettoyer votre dépôt, il suffit de supprimer le répertoire de construction. Cela isole les éléments générés de vos sources d'origine. – Stewart

11

Cette solution ne créera pas de fichier .so, mais un équivalent cmake pour une inclusion ultérieure avec cmake.
Je suis à la recherche d'une solution avec fournira l'équivalent à ceci:

g++ -shared -Wl,-soname,plugin_lib.so.1 -o plugin_lib.so plugin_lib.o 

qui va générer un plugin_lib.so qui peut être chargé dynamiquement avec dlopen lors de l'exécution.

La solution manque l'option « Partagé » comme ceci:

ADD_LIBRARY(mylib SHARED ${mylibSRCS}) 
+0

La réponse acceptée doit être mise à jour –

Questions connexes