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:
-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)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)Des pensées?
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})