J'ai fait quelques recherches et même si je n'ai pas trouvé de solution satisfaisante au problème, j'ai trouvé une demi-solution.
Le problème de statique se résume à 3 choses:
du bâtiment et de relier les bibliothèques internes du projet. Assez simple, il suffit de retourner le commutateur BUILD_SHARED_LIBS
OFF
.
Recherche de versions statiques de bibliothèques externes.
La seule manière semble être de définir CMAKE_FIND_LIBRARY_SUFFIXES
pour contenir le (s) suffixe (s) de fichier souhaité (s) (c'est une liste de priorité).
Cette solution est assez "sale" et très contraire aux ambitions croisées de CMake. À mon humble avis cela devrait être manipulé dans les coulisses par CMake, mais autant que j'ai compris, à cause de la confusion ".lib" sur Windows, il semble que les développeurs CMake préfèrent l'implémentation actuelle.
Liaison statique aux bibliothèques système.
CMake fournit une option qui LINK_SEARCH_END_STATIC
basée sur la documentation: « Mettre fin à une ligne de liaison tels que les bibliothèques système statiques sont utilisés." On pourrait penser que le problème est résolu, mais il semblerait que l'implémentation actuelle ne soit pas à la hauteur de la tâche.Si l'option est activée, CMake génère un appel de linker implicite avec une liste d'arguments qui se termine par les options passées à l'éditeur de liens, y compris -Wl,-Bstatic
, mais cela ne suffit pas, mais indiquer à l'éditeur de liens un lien statique génère une erreur, dans mon cas: /usr/bin/ld: cannot find -lgcc_s
. Il manque également à gcc d'avoir besoin d'une liaison statique via -static
argument qui est pas généré à l'appel de linker par CMake. Je pense que c'est un bug, mais je n'ai pas réussi à obtenir
une confirmation des développeurs encore. Enfin, je pense que tout cela pourrait et devrait être fait par CMake dans les coulisses, après tout, ce n'est pas si compliqué, sauf que c'est impossible sur Windows - si ça compte comme compliqué ...
Pas du dupe de: http://stackoverflow.com/questions/2113231/making-cmake-choose-static -linkage-when-possible, qui est spécifique à GCC. –
En fait, non seulement c'est gcc spécifique, mais c'est aussi une solution peu pratique. Voir mon commentaire à l'autre question. – pszilard
@pszilard Avez-vous fini par trouver la solution? J'essaye de faire la même chose avec g ++. – augustin