CMake ошибка циклической зависимости, когда имя пользовательской библиотеки совпадает с именем системной - PullRequest
3 голосов
/ 05 июня 2010

У меня следующая проблема.

Я пишу файл CMakeLists.txt для создания моего проекта C ++, который состоит из

  1. libhybris.so: разделяемая библиотека с некоторыми экспортированными функциями.
  2. hybris: исполняемый файл, который ссылается на libhybris.so
  3. Набор различных общих библиотек, которые ссылаются на libhybris.so

Проблема в том, что libhybris.so зависит от libpcre (для возможностей регулярных выражений), поэтому у меня есть следующие утверждения:

# 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 (system libpcre.so) - это то же самое, что и мой pcre.so, но это явно не так.

Как я могу решить эту проблему без изменения имени pcre.so?

Ответы [ 2 ]

1 голос
/ 22 января 2013

В CMake рекомендуется указывать любые библиотеки ссылок с полным путем. Чтобы получить полный путь к системной библиотеке, вы можете использовать FIND_PACKAGE(...), если поддерживается, или просто FIND_LIBRARY(...)

Например,

FIND_LIBRARY( PCRE_SYSTEM_LIB pcre )

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

Это не даст CMake расширить что-то, что он распознает как цель (nameley pcre), до полного пути этой цели.

0 голосов
/ 05 июня 2010

Это зависит от вашей среды разработки. Вы можете установить путь сборки, чтобы преодолеть эти трудности.

...