web-dev-qa-db-fra.com

CMake: comment créer une seule bibliothèque partagée à partir de toutes les bibliothèques statiques de sous-projets?

J'ai la disposition suivante:

top_project
    + subproject1
    + subproject2

subproject1 Et subproject2 Créent chacun une bibliothèque statique. Je voudrais lier ces bibliothèques statiques dans une seule bibliothèque partagée au niveau top_project.

Les informations que j'ai recueillies jusqu'à présent sont les suivantes:

  • Soit compiler en utilisant -fPic (Nécessaire sur tout sauf Windows) afin de créer du code indépendant de la position qui permettra de lier les bibliothèques statiques en une seule bibliothèque partagée ou décompresser toutes les bibliothèques statiques (par exemple en utilisant ar ) et les lier à nouveau dans une bibliothèque partagée (qui, je pense, est une solution inélégante et non portable)
  • Tous les fichiers source doivent être donnés explicitement à la commande add_library: Pour une raison que je ne peux pas comprendre, écrire simplement add_library(${PROJECT_NAME} SHARED subproject1 subproject2) ne fonctionne pas comme prévu (il crée essentiellement une bibliothèque vide et ne s'enregistre pas correctement les dépendances)
  • Il y a une fonctionnalité de bibliothèque OBJECT dans CMake mais je ne pense pas que son but soit vraiment de faire ce que je veux.

Des pensées?

50
Deimos

Une autre façon de le faire est de fournir le chemin des fichiers source et des fichiers d'en-tête de tous vos projets, et de les construire ensemble pour produire le .so. C'est généralement la méthode recommandée, au lieu de créer les bibliothèques statiques, puis une bibliothèque partagée à partir de celles-ci.

Fondamentalement, vous devez faire ce qui suit:

FILE(GLOB subproject1_sources
  <sub_project1_lib_sources_dir>/file1.c
  <sub_project1_lib_sources_dir>/file2.c //... etc
)

FILE(GLOB subproject2_sources
  <sub_project2_lib_sources_dir>/file1.c
  <sub_project2_lib_sources_dir>/file2.c //... etc
)

FILE(GLOB topProject_sources
  <top_project_lib_sources_dir>/file1.c
  <top_project_lib_sources_dir>/file2.c //... etc
)

include_directories("<sub_project1_lib_sources_dir>")
include_directories("<sub_project2_lib_sources_dir>")
include_directories("<top_project_lib_sources_dir>") //should be "." if you're building from here

add_library(topProject SHARED ${topProject_sources} ${subproject1_sources} ${subproject2_sources})
0
sasfour