web-dev-qa-db-fra.com

Quel est l'équivalent CMake de "gcc -fvisibility = hidden" lors du contrôle du symbole exporté d'une bibliothèque partagée?

J'ai développé un logiciel multiplateforme en c ++. Comme je le sais, Linux .so a exporté tous les symboles par défaut, bien à travers "gcc -fvisibility=hidden" Je peux définir tous les symboles exportés comme masqués, puis définir __attribute__(visibility("default")) pour la classe et la fonction que je veux exporter , afin que je puisse 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 = caché"?

37
sailing

Au lieu de définir directement les indicateurs du compilateur, vous devez utiliser une version actuelle de CMake et les propriétés <LANG> _VISIBILITY_PRESET à la place. De cette façon, vous pouvez éviter les spécificités du compilateur dans vos CMakeLists et améliorer l'applicabilité multiplateforme (en évitant les erreurs telles que la prise en charge de GCC et non de Clang).

C'est-à-dire que si vous utilisez C++, vous appelez soit set(CMAKE_CXX_VISIBILITY_PRESET hidden) pour définir la propriété globalement, soit set_target_properties(MyTarget PROPERTIES CXX_VISIBILITY_PRESET hidden) pour limiter le paramètre à une bibliothèque spécifique ou à une cible exécutable. Si vous utilisez C, remplacez simplement CXX par C dans les commandes susmentionnées. Vous pouvez également rechercher la propriété VISIBLITY_INLINES_HIDDEN également.

La documentation pour GENERATE_EXPORT_HEADER comprend quelques conseils et exemples supplémentaires liés aux deux propriétés.

65
Joe

Vous pouvez ajouter un indicateur au compilateur Cmake comme ça:

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

Pour vous assurer que cela ne se 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)
5
tune2fs