cmake использовать подстановочный знак для параметра find_library NAMES

В cmake для поиска библиотеки мы используем find_library(MyLibrary_LIBRARY NAMES mylibrary mylibrary10 mylibrary11 HINTS /path/to/library). Эта команда сообщает cmake найти файл с именем mylibrary.so или же mylibrary10.so или же mylibrary11.so (или файлы с .lib суффикс в окнах) на путь HINTS. Если какой-либо из вышеуказанных файлов был найден, путь к файлу был бы записан в MyLibrary_LIBRARYпеременная. Однако, поскольку одна из библиотек, которые я использую, часто обновляется, так что вскоре библиотека будет переименована в mylibrary20.so или же mylibrary21.so- Мне нужно часто обновлять скрипт cmake, чтобы отразить изменения. Интересно, есть ли способ использовать здесь подстановочный знак, чтобы cmake автоматически находил mylibraryXX.so здесь, где XX означает две цифры.

Согласно документации (https://cmake.org/cmake/help/latest/command/find_library.html), похоже, это не поддерживается. Если это так, будут ли другие обходные пути? (Создание ссылки из mylibraryXX.so к mylibrary.so не совсем работает для меня, так как я не контролирую библиотеку.)

1 ответ

Решение

Подстановочный знак не поддерживается в find_library и другие find_* команды.

Если имя библиотеки не фиксировано, то можно перечислить все возможные имена в NAMES вариант.

Например, скрипт FindBoost.cmake собирает все известные версии Boost в переменной:

set(_Boost_KNOWN_VERSIONS ${Boost_ADDITIONAL_VERSIONS}
    "1.74.0" "1.74"
    "1.73.0" "1.73" "1.72.0" "1.72" "1.71.0" "1.71" "1.70.0" "1.70" "1.69.0" "1.69"
    "1.68.0" "1.68" "1.67.0" "1.67" "1.66.0" "1.66" "1.65.1" "1.65.0" "1.65"
    # ...
    "1.34" "1.33.1" "1.33.0" "1.33")

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

Обратите внимание: хотя список известных версий жестко запрограммирован, FindBoost.cmake позволяет (с помощью Boost_ADDITIONAL_VERSIONS переменная) пользователь может указать дополнительные версии, которые могут быть неизвестны сценарию на момент его написания.

Для создания списка возможных имен библиотек с двухзначным суффиксом версии вы можете использовать цикл foreach(RANGE):

set(mylibrary_names)
foreach(ver RANGE 11 99)
  list(APPEND mylibrary_names mylibrary${ver})
endforeach()

find_library(MyLibrary_LIBRARY NAMES ${mylibrary_names})

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

Другие вопросы по тегам