6 votes

Erreur de dépendance cyclique CMake lorsque le nom d'une bibliothèque personnalisée est le même que celui d'une bibliothèque système

J'écris un fichier CMakeLists.txt pour construire un de mes projets C++, qui est composé de

  1. libhybris.so : Une bibliothèque partagée avec quelques fonctions exportées.
  2. hybris : Un exécutable qui se lie à libhybris.so
  3. Un ensemble de diverses bibliothèques partagées liées à libhybris.so

Le problème est que libhybris.so dépend de libpcre (pour les capacités d'expression régulière), et j'ai donc les déclarations suivantes :

# libhybris.so generation
add_library( libhybris 
             SHARED 
             ${LIB_SOURCES} )

...

# Needed libraries
target_link_libraries( libhybris 
                       dl 
                       pcre 
                       pthread
                       readline )

Et l'une des bibliothèques partagées du point 3 s'appelle pcre.so, donc j'ai aussi ce qui suit :

add_library( pcre SHARED ${PCRE_SOURCES} )

...

target_link_libraries( pcre
                       dl 
                       pcre 
                       curl
                       pthread
                       readline
                       ffi 
                       libhybris )

Ainsi, lorsque je lance un "cmake .", j'obtiens l'erreur suivante :

-- Configuring done
CMake Error: The inter-target dependency graph contains the following strongly connected component (cycle):
  "libhybris" of type SHARED_LIBRARY
    depends on "pcre"
  "pcre" of type SHARED_LIBRARY
    depends on "libhybris"
At least one of these targets is not a STATIC_LIBRARY.  Cyclic dependencies are allowed only among static libraries.

Parce que CMake pense que la dépendance pcre de libhybris.so (système libpcre.so) est la même que celle de mon pcre.so, ce qui n'est évidemment pas le cas.

Comment puis-je résoudre ce problème ? sans changer le nom de pcre.so ?

2voto

Johannes S. Points 1905

Dans CMake, il est recommandé de spécifier toutes les bibliothèques de liens avec le chemin complet. Pour obtenir le chemin complet de la bibliothèque système, vous pouvez soit utiliser FIND_PACKAGE(...) s'il est pris en charge ou simplement FIND_LIBRARY(...)

Par exemple,

FIND_LIBRARY( PCRE_SYSTEM_LIB pcre )

ADD_LIBRARY( libhybris SHARED ${LIB_SOURCES} )
TARGET_LINK_LIBRARIES( libhybris
                       ${PCRE_SYSTEM_LIB}
                       ......
                      )

Cela empêchera CMake d'étendre quelque chose qu'il reconnaît comme une cible (nameley pcre ) au chemin complet de cette cible.

0voto

CodingTwinky Points 432

Cela dépend de votre environnement de développement. Vous pouvez définir un chemin de construction pour surmonter ces difficultés.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X