2009-09-07 6 views
16

Je dispose d'un fichier CMakeLists.txt qui ressemble à ceci:Comment créer des fichiers objet une seule fois avec cmake?

add_executable(exec1 exec1.c source1.c source2.c source3.c) 
add_executable(exec2 exec2.c source1.c source2.c source3.c) 
add_executable(exec3 exec3.c source1.c source2.c source3.c) 

Les fichiers source1.o source2.o source3.o prennent vraiment beaucoup de temps à construire, et comme ils sont communs à tous les executables, Je veux que chacun d'eux ne soit construit qu'une seule fois. Le comportement actuel de cmake, cependant, est de les reconstruire séparément pour chaque cible exec, ce qui est une duplication inutile de l'effort.

Existe-t-il un moyen de dire à cmake de ne créer des fichiers objets qu'une seule fois?

Répondre

15

Non, ce serait difficile à atteindre puisque les fichiers source peuvent être compilés avec différentes options de compilation, post-construction étapes, etc.

Ce que vous pouvez faire est de mettre les fichiers objets dans une bibliothèque statique et lien avec cette place:

add_library(mylib STATIC source1.c source2.c) 
add_executable(myexe source3.c) 
target_link_libraries(myexe mylib) 

EDIT: bien sûr, vous pouvez le mettre dans une bibliothèque aussi bien partagée.

+3

Faites attention avec cette approche. Les bibliothèques partagées peuvent être plus conviviales s'il y a beaucoup d'exes impliqués http://blog.flameeyes.eu/2008/01/21/what-to-do-with-shared-code – richq

+2

Oui, bien sûr. Je pense que j'ai juste supposé que l'OP voulait que le code soit dupliqué dans chacun des exécutables. – JesperE

12

Oui, dans CMake 2.8.8 vous pouvez utiliser une bibliothèque d'objets, qui est une sorte de bibliothèque virtuelle ayant les mêmes propriétés d'organisation et de dépendance qu'une vraie bibliothèque statique ou partagée, mais ne produisant pas de fichier sur disque. Voir Tutoriels CMake: Object Library.

Questions connexes