2011-02-23 3 views
20

J'essaie de déplacer mon projet vers CMake, tout en ayant une certaine optimisation sur le processus de compilation.CMake: réutilisation des fichiers objet construits pour une lib dans une autre cible lib

est ici l'affaire:

  • J'ai plusieurs subdirs qui sont (doivent être) chaque compilé dans une bibliothèque statique (cela fonctionne).
  • Je veux regrouper tous les fichiers objets de chaque sous-répertoire dans une autre bibliothèque statique complète et plus volumineuse.

Il ressemble à ceci:

. 
libBig.a # made from object from subdir1 and subdir2 
subdir1/ 
    src/ 
    libSubdir1.a 
subdir2/ 
    src/ 
    libSubdir2.a 

Aujourd'hui, je réussi à utiliser une variable globale dans laquelle chaque subdir CMakeLists.txt ajoutera ses propres fichiers source. J'utilise cette variable comme entrée « source » dans ma grande bibliothèque:

# the big library depends on all the source files 
# ${all_src} is automatically filled with each subdir's cpp file 
get_property(BigLib_src GLOBAL PROPERTY all_src) 
add_library(Big STATIC ${BigLib_src}) # recompiles all the sources 

Maintenant, cela fonctionne, pas trop mal, mais la chose est, tous mes fichiers source obtenir compilé deux fois: une fois subdir bibliothèque, et une fois pour la grande bibliothèque. CMake semble oublier qu'il les a déjà construits.

I avoir pour conserver les bibliothèques de sous-répertoires et ar ne peut pas fusionner deux bibliothèques statiques.

Savez-vous comment faire?

+0

Que vous déplacez à CMake de, de toute façon? Pourquoi? –

+1

De Makefiles à la main! Je veux que ce soit facile à compiler multiplate-forme, facile à intégrer avec les IDE, et j'ai pensé: pourquoi pas? – Gui13

Répondre

25

Vous pouvez utiliser la nouvelle bibliothèque OBJECT fonctionnalité introduite dans CMake 2.8.8. l'idée est expliqué here. en fait, la bibliothèque d'objets est un concept similaire au convenience library connu de Autotools aux fichiers objet groupe.

Vérifiez la complète CMake OBJECT library tutorial.

+1

J'ai eu le même problème et essayé la bibliothèque OBJECT, cela fonctionne comme un charme. Je vous remercie –

3

À partir de CMake 2.8.8, vous pouvez le faire en utilisant le type de bibliothèque OBJECT. Voir mloksot's réponse. L'ancienne situation était que chaque cible avait son propre répertoire et CMake construisait chaque objet dépendant pour chaque cible. Cela protège contre un cas où un fichier source pourrait être utilisé plusieurs fois avec différents CFLAGS. (Notez que par défaut CMake est plus conservateur qu'automake ici: automake arrêtera de réutiliser des fichiers objet pour différentes cibles seulement si les cibles sont construites avec CFLAGS (et probablement aussi CPPFLAGS)

+0

C'est ce que j'ai fait finalement, mais je ne suis toujours pas satisfait du résultat, car maintenant mon CMakeLists semble gonflé et atteint le même nombre de lignes que mon Makefile original ... peut-être pour une future version de CMake. – Gui13

+0

Avez-vous essayé 'automake', avec les bibliothèques de libtool? Ou en avez-vous marre de tourner avec les systèmes de construction à ce stade ;-)? Vous n'aurez peut-être même pas besoin des libs de commodité si vous conduisez le tout à partir d'un 'Makefile.am' non récurrent. –

Questions connexes