CMake et de l'ordre dépendant de la liaison de bibliothèques partagées
J'ai quelques petits composants que je suis de construction des bibliothèques partagées pour mon application principale. Prenons un exemple de liba
et libb
. Chacun est construit à l'intérieur de leur propre sous-répertoire comme suit:
add_library(liba SHARED a.cpp)
Puis, dans le dossier racine du projet, j'ai besoin de lier ma principale de l'application à la fois.
include_directories(a)
include_directories(b)
add_executable(dummy dummy.cpp)
target_link_libraries(dummy a b)
CMake fonctionne très bien avec cela, et mon application compile mais ne parvient pas à lier. Le problème, c'est que le b fait référence à un. Si je l'approvisionnement de l'ordre des bibliothèques, tout en les reliant comme
target_link_libraries(dummy b a)
Le programme compile et liens fine
Quand ce genre de système démarre impliquant plus complexes inter dépendance des bibliothèques, il commence à être impossible, même si les dépendances sont acycliques. Comment puis-je gérer l'étape de liaison ici? Est-il un truc pour la commande de bibliothèques de lien CMake?
Vous devez vous connecter pour publier un commentaire.
Vous pouvez spécifier la relation entre
a
etb
en ajoutantÀ partir de la docs:
Donc, si vous spécifiez
a
comme une dépendance deb
de cette façon, vous n'avez même pas besoin de la liste explicite dea
dans toute cible qui dépendb
, par exemple, votre commande peut être juste:bien qu'il ne fera pas de mal à la liste
a
ainsi.target_link_libraries(jemalloc pthread)
j'obtiens l'erreur suivante:Cannot specify link libraries for target "jemalloc" which is not built by this project.
find_library
pour chacun d'eux, et avec les résultats (en supposant qu'ils sont tous les deux trouvé correctement) neset(JemallocLibs ${JemallocLib} ${PthreadLib})
. Ensuite, il vous suffit de faire par exempletarget_link_libraries(MyLib ${JemallocLibs})
.target_link_libraries(MyProj GLFW)
) qui dépend de l' X11 (-lX11
). Je n'ai pas trouver un moyen avec ce genre de dépendances dans cmake.b
ne doit pas seulement être une bibliothèque compilée par le projet actuel, mais même dans le même répertoire quea
. Si vous avez un hiérarchiqueCMakeList
structure à l'aide deadd_subdirectory
, vous pouvez obtenirAttempt to link library a to target b which is not built in this directory
Une solution facile (surtout pour les dépendances circulaires) peut être il suffit de mettre tous vos bibliothèques dans une variable de liste, puis ajouter cette liste deux fois (ou plus si nécessaire), comme:
(ou tout simplement le type de la liste deux fois après l'autre dans le
target_link_libraries
fonction)Ce qui a fonctionné pour moi tout à fait une couple de fois, mais je dois admettre qu'il pourrait y avoir certains inconvénients possibles que je suis pas au courant de (autre que l'apparente un peu un hack).