Как использовать cmake target_link_libraries для связывания библиотек, соответствующих глобусу?

У меня есть готовые сторонние библиотеки (Boost), которые я хочу связать со своей целью. Все они хранятся в одном каталоге, таком как ${BOOST_PATH}/lib/libboost_thread.a, ${BOOST_PATH}/lib/libboost_log.a и т. д. Поэтому я хотел бы сделать что-то вроде этого: target_link_libraries(${TARGET} PRIVATE "${BOOST_PATH}/libboost*.a") Я прочитал это FILE(GLOB...) можно использовать, но настоятельно не рекомендуется. И я не уверен, что это вообще сработает. Почему? Как бы вы решили эту проблему, если вы не можете изменить структуру каталогов библиотек Boost?


person Gabor Marton    schedule 28.07.2014    source источник


Ответы (2)


Есть две возможности.

  1. Использование glob не рекомендуется, потому что если вы добавите в эту папку новую библиотеку boost, CMake не обнаружит ее автоматически. Вам придется перезапустить CMake вручную, чтобы подобрать новую библиотеку. Однако никакое другое решение подстановки не предотвратило бы эту проблему, кроме как выполнять подстановку при каждом вызове сборки. Итак, что вы можете сделать, это просто перечислить все файлы:

    target_link_libraries(${TARGET} PRIVATE
      "${BOOST_PATH}/libboost_filesystem.a"
      "${BOOST_PATH}/libboost_system.a"
      "${BOOST_PATH}/libboost_chrono.a"
      ...
    )
    
  2. Второе решение - использовать то, что вы предложили. Что-то в этом роде должно работать:

    file(GLOB LIBS "${BOOST_PATH}/libboost*.a")
    target_link_libraries(${TARGET} PRIVATE ${LIBS})
    
person Jan Rüegg    schedule 28.07.2014

Или вы можете использовать встроенные возможности CMake для связи с Boost, например:

set(Boost_USE_STATIC_LIBS ON)
find_package(Boost 1.55.0 REQUIRED thread system log)

include_directories(${Boost_INCLUDE_DIRS})

target_link_libraries(${TARGET} ${Boost_LIBRARIES})

Это предполагает стандартную установку Boost с макетом каталога по умолчанию.

Я не думаю, что подстановка — это хорошая идея, потому что вы, вероятно, не зависите от всех библиотек, скомпилированных Boost, и вы сделаете компоновку медленнее без веской причины.

Даже если вы это сделаете, по-прежнему рекомендуется явно перечислять зависимости.

person SirDarius    schedule 28.07.2014
comment
Когда я это делаю, я получаю сообщение об ошибке CMake в CMakeLists.txt:21 (target_link_libraries): target_link_libraries вызывается с неправильным количеством аргументов. - person Alex; 15.07.2015