J'ai fait quelques recherches, et bien que je ne pouvais pas trouver une solution satisfaisante au problème, j'ai trouvé une demi-solution.
Le problème de statique construit se résume à 3 choses:
-
La construction et la liaison du projet interne de bibliothèques.
Assez simple, il suffit d'inverser la BUILD_SHARED_LIBS
interrupteur ON
.
-
Trouver des versions statiques des bibliothèques externes.
Le seul moyen semble s' CMAKE_FIND_LIBRARY_SUFFIXES
à contenir le fichier de suffixe(es) (c'est une liste de priorités).
Cette solution est tout à fait un "sale" et très bien contre CMake cross plate-forme de leurs aspirations. À mon humble avis, cela devrait être géré en coulisses par CMake, mais que j'ai compris, en raison de la ".lib" une confusion sur Windows, il semble que le CMake développeurs préfèrent la mise en œuvre actuelle.
Lier statiquement contre le système de bibliothèques.
CMake fournit une option LINK_SEARCH_END_STATIC
qui est basée sur la documentation: "la Fin d'une ligne de liaison tels que le système statique bibliothèques sont utilisées."
On pourrait penser, c'est ça, le problème est résolu. Cependant, il semble que la mise en œuvre actuelle n'est pas à la hauteur. Si l'option est activée, CMake génère un implicite de l'éditeur de liens appeler avec une liste d'arguments qui se termine avec les options passées à l'éditeur de liens, y compris -Wl,-Bstatic
. Cependant, ce n'est pas suffisant. Seulement demandant à l'éditeur de liens à lier statiquement une erreur, dans mon cas: /usr/bin/ld: cannot find -lgcc_s
. Ce qui manque, c'est dire à gcc en tant que bien que nous avons besoin de la liaison statique par le biais de l' -static
argument qui n'est pas généré pour l'éditeur de liens appeler par CMake. Je pense que c'est un bug, mais je n'ai pas réussi à obtenir une confirmation de la part des développeurs encore.
Enfin, je pense que tout cela pourrait et devrait être fait par CMake en coulisses, après tout ce n'est pas si compliqué, sauf que c'est impossible sur Windows - si qui comptent aussi compliqué...