2017-05-16 1 views
1

Je crée une bibliothèque partagée C++ pour un projet personnel interne et j'utilise cmake pour le processus de liaison/compilation. En ce moment, mon fichier CMakeLists.txt ressemble à ceciDéploiement de la bibliothèque partagée C++ avec des en-têtes spécifiques

cmake_minimum_required(VERSION 3.7) 
project(borges) 

set(CMAKE_BUILD_TYPE Release) 

set(CMAKE_CXX_STANDARD 11) 

include_directories(include) 

file(GLOB SOURCES "src/*.cpp") 

add_library(borges SHARED ${SOURCES}) 

install(TARGETS borges DESTINATION /usr/local/lib) 

J'ai compilé avec succès mes fichiers, mais sais que je suis un peu préoccupé par « encapsulation ». Je me demandais s'il y avait un moyen de n'exposer que certains fichiers .h, car il y a des classes qui n'auraient pas beaucoup de sens à utiliser en dehors du contexte de ma bibliothèque. Quelque chose comme des classes "privées" de la bibliothèque et exposer uniquement les classes que les gens utiliseraient en externe

Répondre

1

Je ne suis pas sûr si vous le savez déjà en fonction de votre question, mais votre CMakeLists.txt actuel n'installe pas d'en-têtes . Pour installer les spécifiques, tout ce que vous devez faire est de lister les fichiers .h que vous souhaitez installer et de les transmettre à la commande install de CMake:

set(HEADERS_TO_INSTALL foo.h bar.h borges.h) 
# ... 
install(FILES ${HEADERS_TO_INSTALL} DESTINATION include) 

Sur une note de côté, il est beaucoup mieux d'utiliser des chemins relatifs vos arguments install(DESTINATION). Ceux-ci seront interprétés par rapport à la variable CMAKE_INSTALL_PREFIX, dont la valeur par défaut est actuellement /usr/local.

Si vous voulez interdire effectivement les gens de lien vers les classes internes, alors vous pouvez regarder dans GCC visibility control