当自定义库名称与系统库相同时,CMake循环依赖性错误

时间:2010-06-04 21:40:05

标签: c++ shared-libraries cmake cyclic

我有以下问题。 我正在编写一个CMakeLists.txt来构建我的C ++项目,该项目由

组成
  1. libhybris.so:包含一些导出函数的共享库。
  2. hybris:链接到libhybris.so
  3. 的可执行文件
  4. 一组链接到libhybris.so
  5. 的各种共享库

    问题是,libhybris.so依赖于libpcre(对于regexp功能),所以我有以下声明:

    # libhybris.so generation
    add_library( libhybris 
                 SHARED 
                 ${LIB_SOURCES} )
    
    ...
    
    # Needed libraries
    target_link_libraries( libhybris 
                           dl 
                           pcre 
                           pthread
                           readline )
    

    第3点的一个共享库名为pcre.so,所以我也有以下内容:

    add_library( pcre SHARED ${PCRE_SOURCES} )
    
    ...
    
    target_link_libraries( pcre
                           dl 
                           pcre 
                           curl
                           pthread
                           readline
                           ffi 
                           libhybris )
    

    所以,当我运行“cmake”时。我有以下错误:

    -- 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.
    

    因为cmake认为libhybris.so pcre依赖(系统libpcre.so)与我的pcre.so相同,这显然不是。

    如何解决此问题不用更改pcre.so名称?

2 个答案:

答案 0 :(得分:1)

在CMake中,推荐的方法是指定任何具有完整路径的链接库。要获取系统库的完整路径,您可以使用FIND_PACKAGE(...)(如果支持)或仅FIND_LIBRARY(...)

e.g:

FIND_LIBRARY( PCRE_SYSTEM_LIB pcre )

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

这将阻止CMake将其识别为目标(nameley pcre)的内容扩展到该目标的完整路径。

答案 1 :(得分:0)

取决于您的开发环境,您可以设置构建路径来克服这些困难。