2015-09-27 3 views
2

Мне нужно установить ссылку на стороннюю предварительно созданную общую библиотеку. В Windows это означает связь с Third_party.lib, а также на Linux/Android, что означает связь с libThird_party.so. Поэтому в интересах перекрестного platformness, я попытался написать, что, как:Префикс/суффикс библиотеки Cmake

${CMAKE_IMPORT_LIBRARY_PREFIX}Third_party${CMAKE_IMPORT_LIBRARY_SUFFIX} 

Который прекрасно работает на Windows, но на Linux/Android, эти переменные являются пустыми. Я понимаю, что у Linux/Android нет библиотек импорта, но тем не менее эти переменные, являющиеся пустыми, на самом деле являются большой неприятностью. И изменение переменных на CMAKE_SHARED_LIBRARY_... тоже не работает, потому что хотя Linux/Android будет искать lib/.so, как я хочу, Windows будет искать .dll, чего я не хочу.

Похоже, я могу исправить это, заполнив переменные библиотеки импорта (только в Linux) со значениями из переменных разделяемой библиотеки. Но ... это действительно лучший способ? Я не могу быть первым человеком, который справится с этим.

ответ

1

Обычно вы разрешаете CMake и его помощникам выполнять эту работу по определению правильного имени. Вполне возможно, что для вашей сторонней библиотеки уже есть сценарий Find<Library>.cmake.

Если нет: Вот что-то взято из FindUSB.cmake из GNU Radio

if(NOT LIBUSB_FOUND) 
    pkg_check_modules (LIBUSB_PKG libusb-1.0) 
    find_path(LIBUSB_INCLUDE_DIR NAMES libusb.h 
    PATHS 
    ${LIBUSB_PKG_INCLUDE_DIRS} 
    /usr/include/libusb-1.0 
    /usr/include 
    /usr/local/include 
) 

    find_library(LIBUSB_LIBRARIES NAMES usb-1.0 usb 
    PATHS 
    ${LIBUSB_PKG_LIBRARY_DIRS} 
    /usr/lib 
    /usr/local/lib 
) 

if(LIBUSB_INCLUDE_DIR AND LIBUSB_LIBRARIES) 
    set(LIBUSB_FOUND TRUE CACHE INTERNAL "libusb-1.0 found") 
    message(STATUS "Found libusb-1.0: ${LIBUSB_INCLUDE_DIR}, ${LIBUSB_LIBRARIES}") 
else(LIBUSB_INCLUDE_DIR AND LIBUSB_LIBRARIES) 
    set(LIBUSB_FOUND FALSE CACHE INTERNAL "libusb-1.0 found") 
    message(STATUS "libusb-1.0 not found.") 
endif(LIBUSB_INCLUDE_DIR AND LIBUSB_LIBRARIES) 

mark_as_advanced(LIBUSB_INCLUDE_DIR LIBUSB_LIBRARIES) 

endif(NOT LIBUSB_FOUND) 

Обратите внимание на pkg_check_modules директивы и директивы find_library, что заботиться о давая вам правильные вещи, не вы вручную добавляя суффиксы и т.д. .

Возможно, вы захотите добавить путь, по которому вы ожидаете, что ваш .dll будет в PATHS аргументах find_path и find_library (это указатели для CMake, чтобы знать, где искать).

+0

Спасибо. У меня есть следующий вопрос. Некоторые из этих библиотек загружаются и скомпилируются с помощью ExternalProject, что означает, что они не будут существовать до времени сборки. Это вызывает проблему при запуске начальной команды cmake, поскольку она не может связываться с переменными, которые содержат значение NOTFOUND. –

+0

, как правило, у вас будут подкаталоги со своим CMakeLists.txt и их запуск, а также запуск оттуда. Однако реальный мир обычно намного сложнее. Задайте совершенно новый вопрос о StackOverflow с гораздо более подробной информацией :) –

Смежные вопросы