2010-06-04 28 views
3

J'ai le problème suivant. J'écris un CMakeLists.txt pour construire un projet C++ de la mine, qui est composé deErreur de dépendance cyclique CMake lorsque le nom de la bibliothèque personnalisée est identique à celui d'une bibliothèque système

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

Le problème est que, libhybris.so dépend de libpcre (pour les capacités regexp) , donc j'ai 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 à partir du point 3, est appelé pcre.so, donc j'ai les suivantes aussi:

add_library(pcre SHARED ${PCRE_SOURCES}) 

... 

target_link_libraries(pcre 
         dl 
         pcre 
         curl 
         pthread 
         readline 
         ffi 
         libhybris) 

Donc, quand je cours un "cmake". J'ai 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 libhybris.so de PCRE (système libpcre.so) est le même de mon pcre.so qui est évidemment pas.

Comment puis-je résoudre ce problème sans en changeant pcre.so nom?

Répondre

0

En fonction de vos environnements de développement, vous pouvez définir le chemin de génération pour surmonter ces difficultés.

+0

Si je ne spécifie pas le nom explicitement (en donnant le chemin complet de libhybris.so par exemple) cmake ne reconnaîtra pas libhybris.so en tant que dépendance de pcre.so, j'ai déjà essayé cela. –

1

Dans CMake, la méthode recommandée consiste à spécifier toutes les bibliothèques de liens avec chemin d'accès complet. Pour obtenir le chemin complet de la bibliothèque du système, vous pouvez utiliser FIND_PACKAGE(...) si 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 permettra d'éviter CMake de se développer quelque chose qu'il reconnaît comme une cible (nameley pcre) à le chemin complet de cette cible.