2017-01-10 19 views
0

Я ищу хороший способ обработки связанных libs в cmake. В моем случае файл конфигурации cmake (CMakeLists.txt) выполняется в средах Linux и на cygwin в Windows. Процесс сборки содержит две библиотеки. libA создается из источников и зависит только от std. C API. libB также создается из источников и включает libA. Библиотеки создаются отдельно (с собственным git-воспроизведением).Как искать библиотеки в мультиплатформенных сборках cmake?

Определяя в CMake в "libB/CMakeLists.txt"

find_library (libB A) 

Я связывая libB против Либа. При связывании под cygwin эта строка терпит неудачу. Когда я меняю его на

find_library (libB ${CMAKE_LIBRARY_PATH}/static/libA.dll.a) 

это работает.

Обе библиотеки создаются как общие библиотеки.

"Либа/CMakeLists.txt":

add_library(libA SHARED ${libA_source}) 
install(
     TARGETS libA 
     RUNTIME DESTINATION ${CMAKE_INSTALL_FULL_BINDIR} 
     LIBRARY DESTINATION ${CMAKE_INSTALL_FULL_LIBDIR} 
     ARCHIVE DESTINATION ${CMAKE_INSTALL_FULL_LIBDIR}/static 
    ) 

и

"libB/CMakeLists.txt":

add_library(libB SHARED ${libB_source}) 
install(
     TARGETS libB 
     RUNTIME DESTINATION ${CMAKE_INSTALL_FULL_BINDIR} 
     LIBRARY DESTINATION ${CMAKE_INSTALL_FULL_LIBDIR} 
     ARCHIVE DESTINATION ${CMAKE_INSTALL_FULL_LIBDIR}/static 
    ) 

Под Linux это работает отлично. Библиотеки размещаются в «/ user/local/lib». В Windows libs помещаются в «/ user/local/lib/shared» +, dll помещаются в «/ user/local/bin».

Заявление связать libB против Lība изменения в («libB/CMakeLists.txt»):

if (UNIX) 
    find_library (libB A) 
elseif (CYGWIN) 
    find_library (libB ${CMAKE_LIBRARY_PATH}/static/libA.dll.a) 
endif() 

Любая идея, как обрабатывать ссылки компоновщика этих двух строит в простом - может быть, - не зависит от платформы линия?

+1

Вместо 'find_library' называть это должно быть' target_link_libraries', не Это? – Tsyvarev

+0

Lib A и B зависят, но строятся отдельно. Нет возможности использовать target_link_libraries для связывания проектов. –

+1

Вы, должно быть, неправильно поняли назначение команд. Target_link_libraries используется для компиляции библиотек, которые создает проект. Find_library - поиск внешних библиотек. Вы смешиваете их. – usr1234567

ответ

1

Это должно работать в пределах вашего libB/CMakeLists.txt:

find_library(libA 
      NAMES A libA libA.so libA.dll libA.dll.a 
      HINTS ${CMAKE_INSTALL_FULL_LIBDIR} 
) 
target_link_libraries(libB ${libA}) 

Проверьте путь к Либу с

message(STATUS "libA=${libA}")