2010-12-11 49 views
7

En relation avec using cmake to link object files into lib.xxxx.a file, mais pas tout à fait la même chose, j'ai construit plusieurs bibliothèques statiques sur Windows en utilisant CMake 2.8.x en utilisant VS2008 SP1 . Existe-t-il un moyen via CMake seul de relier tous les fichiers .obj dans toutes ces bibliothèques statiques existantes dans une bibliothèque monolithique plus grande, de préférence via la fonction CMake add_library, ou autre construction similaire?Lier plusieurs fichiers .lib statiques dans un fichier .lib monolithique en utilisant VS2008 SP1 en utilisant CMake 2.8.x

Je pense que la réponse est « non », et donc je l'ai pensé à rouler ma propre via une commande personnalisée via l'approche habituelle add_custom_command + add_custom_target, qui construit simplement la bibliothèque manuellement, en fournissant toutes les autres bibliothèques obj fichiers lors de l'appel LINK.EXE. Mais je vois quelques problèmes avec cette approche:

  1. je ne pouvais pas trouver une variable CMake qui indique le chemin d'accès complet à l'exécutable LINK.EXE. Je devrais alors dériver le chemin vers LINK.EXE en utilisant une heuristique fragile: Il est fragile dans le sens où différentes versions de Visual Studio peuvent localiser le fichier LINK.EXE dans différents répertoires, et j'ai besoin de cela pour fonctionner à la fois 32 bits et Conditions du compilateur Windows 64 bits, et être résilient contre les mises à niveau entre VS2008 et les futures révisions du compilateur.
  2. Je dois trouver un moyen de trouver tous les fichiers OBJ des autres bibliothèques statiques, au moment de la construction contre au moment CMake, depuis lors CMake les fichiers OBJ bien sûr ne le font pas (toujours) existent. Pour des raisons de performance de construction, je ne souhaite pas avoir à extraire les fichiers .obj des fichiers .lib pour les ajouter à la ligne de commande LINK.EXE, donc une construction FILE(GLOB...) serait ma meilleure seconde alternative dans ce cas.
  3. Il est possible d'appeler simplement LINK.EXE via: LINK.EXE /OUT:monolithic.lib lib1.lib lib2.lib ..., mais peut-être pas tous les années .obj sera inclus (EDIT: Je confirme que LINK.EXE omet certains fichiers OBJ de lib1.lib lib2.lib ... sans aucun message de diagnostic expliquant pourquoi, si cette approche est un non-démarreur); les documents en ligne pour LINK.EXE ne sont pas claires quant à ce point. Quelqu'un at-il une expérience avec l'utilisation de LINK.EXE de cette manière?

Merci,

Brent

post-scriptum, je sais comment créer une DLL en utilisant CMake, mais je ne veux pas spécifiquement d'avoir recours à la construction d'une DLL à ce moment.

Répondre

10

Créez une bibliothèque statique "fusionnée" avec un fichier source fictif et ajoutez des bibliothèques à fusionner dans STATIC_LIBRARY_FLAGS. Elles constitueront donc une entrée supplémentaire pour lib.exe.

Ce serait quelque chose comme:

ADD_LIBRARY (fusionné STATIC dummy.c)

SET_TARGET_PROPERTIES (fusionnée PROPRIETES
STATIC_LIBRARY_FLAGS « chemin complet \ \ à \ LIB1.LIB chemin complet \ \ to \ lib2 .lib ")

Cette approche est utilisée dans MySQL, il y a une macro plus générale ici pour fusionner des bibliothèques statiques qui fonctionnent avec cross-plate-forme. Il peut être trouvé ici http://www.mail-archive.com/[email protected]/msg28670/libutils.cmake

+0

Macro MERGE_STATIC_LIBS définie dans http://www.mail-archive.com/[email protected]/msg28670/libutils.Le lien cmake est très proche de ce que j'aurais mis en place. Un avertissement: Ce lien pointe vers un fichier qui est spécifique à mysql, il devrait donc être généralisé pour qu'il soit utilisable en pratique. – bgoodr

+0

Le libutils.cmake ci-dessus ne fonctionne en effet pas de manière autonome, car il fait référence à merge_archives_unix.cmake.in configurable Ce fichier est disponible sur http://www.mail-archive.com/[email protected]/msg28670/merge_archives_unix.cmake. dans –