web-dev-qa-db-fra.com

CMake: liaison statique contre libgcc et libstdc ++ dans une bibliothèque partagée

Problème:

J'ai des difficultés à lier glibcc/glibc ++ dans une bibliothèque partagée en utilisant CMake et GCC4.9 sur mon installation Ubuntu 16.04.

Conditions supplémentaires:

Le chargement de la bibliothèque partagée pose un problème dans l'environnement de production de Red Hat (où je le copie), je crois parce qu'il utilise une version libstc ++ différente (erreur: GLIBCXX_3_4_20 introuvable). Je n'ai pas de droits Sudo et ne peux pas mettre à niveau la machine.

Comme je l'ai dérivé de this blog, this post , j'ai essayé de lier la liaison statique contre libgcc et libgc ++ en utilisant:

set(CMAKE_EXE_LINKER_FLAGS "-static-libgcc -static-libstdc++ -static")

et vieillir en utilisant

set(CMAKE_SHARED_LINKER_FLAGS "-static-libgcc -static-libstdc++ -static")

Mais ça ne marche pas. Ce que fonctionne est ce script CMake:

add_library(myLib SHARED ${SOURCE_FILES})
set(CMAKE_EXE_LINKER_FLAGS " -static")
target_link_libraries(myLib -static-libgcc -static-libstdc++)

Ce doit être la mauvaise façon de procéder, à ma connaissance -static-libgcc et -static-libstdc ++ sont des options de l'éditeur de liens et non des bibliothèques ...

Question : Comment puis-je établir une liaison statique avec -libgcc et -libstdc ++ correctement?

Merci d'avance!

16
DA--

Oui, target_link_libraries est un moyen correct de définir les indicateurs de l'éditeur de liens ou les options de l'éditeur de liens.

Documentation de target_link_libraries:

Spécifiez les bibliothèques ou les indicateurs à utiliser lors de la liaison d'une cible donnée.

Les noms d'élément commençant par -, mais pas -l ou -framework, sont traités comme des indicateurs de l'éditeur de liens.

https://cmake.org/cmake/help/v3.0/command/target_link_libraries.html (emphase pas dans l'original)

14
SpamBot