Quel est L'équivalent de "gcc-fvisibility=hidden" pour contrôler le symbole exporté d'une bibliothèque partagée?

j'ai développé des logiciels multiplateformes en c++. Comme je le sais, Linux .donc exporté tous les symboles par défaut, bien à travers "gcc -fvisibility=hidden" je peux mettre tous les symboles exportés comme cachés, puis définissez __attribute__(visibility("default")) pour la classe et la fonction que je veux exporter, donc je peux contrôler ce que je veux exporter.

ma question Est, en utilisant CMake, Comment puis-je faire le travail en tant que contrôle "gcc-fvisibility=hidden"?

28
demandé sur Joe 2013-06-13 10:48:53

2 réponses

au lieu de définir directement les options du compilateur, vous devriez utiliser la version actuelle de CMake et le _VISIBILITY_PRESET propriétés à la place. De cette façon, vous pouvez éviter les spécificités du compilateur dans vos listes Cmakel et améliorer l'applicabilité de la plateforme croisée (en évitant les erreurs telles que le support de GCC et non de Clang).

set(CMAKE_CXX_VISIBILITY_PRESET hidden) pour définir la propriété globalement, ou set_target_properties(MyTarget PROPERTIES CXX_VISIBILITY_PRESET hidden) pour limiter le paramètre à une bibliothèque spécifique, ou exécutable cible. Si vous utilisez C juste remplacer CXX par C desdites commandes. Vous pouvez également vouloir enquêter sur le VISIBLITY_INLINES_HIDDEN bien ainsi.

GENERATE_EXPORT_HEADER comprend d'autres conseils et exemples relatifs aux deux propriétés.

46
répondu Joe 2015-07-09 14:04:21

vous pouvez ajouter un drapeau au compilateur Cmake comme ceci:

SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fvisibility=hidden")

pour vous assurer que cela n'est fait que sous Linux, vous pouvez utiliser ce code:

IF(UNIX)
    IF(CMAKE_COMPILER_IS_GNUCC)
         SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fvisibility=hidden")
    ENDIF(CMAKE_COMPILER_IS_GNUCC)
ENDIF(UNIX)
4
répondu tune2fs 2013-06-13 08:21:51