Как переключиться с общей библиотеки на статическую библиотеку с помощью CMake

Контекст:

Я создал a.out в своей локальной системе с современным проектом CMake, добавив зависимость к общей библиотеке:

find_package(GDAL QUIET)

if(GDAL_FOUND)
  get_property(_loc TARGET GDAL::GDAL PROPERTY LOCATION)
  message(STATUS "Found GDAL: ${_loc} (version ${GDAL_VERSION})")
  add_library(gdal_external INTERFACE)  # dummy

В моей системе все работает нормально. Теперь я хочу распространить a.out на системы, которые не имеют зависимости (.so).

Проблема:

Я скопировал бинарный файл a.out на кластер, и когда я его выполняю, я получаю следующую ошибку: error while loading shared libraries: libgdal.so.26: cannot open shared object file: No such file or directory.

Возможное решение и другие соображения

  • Устанавливаю зависимости на кластер, но у меня нет прав администратора на этом сервере
  • даже если у меня была установлена ​​​​зависимость персоналом, та же проблема возникнет позже, когда я отправлю двоичный файл возможным пользователям.
  • Я не могу просить будущих пользователей управлять зависимостями и строить из исходников.
  • Мне кажется, что я должен встроить все зависимости в один и тот же исполняемый файл, то есть использовать статическую библиотеку, а не делиться
  • Размер исполняемого файла или проблемы с памятью не являются приоритетом

Как указать CMake использовать статическую версию библиотеки?


person Arnaud Becheler    schedule 17.12.2020    source источник
comment
Итак, у вас есть статическая библиотека GDAL? Его получение, очевидно, должно быть первым шагом для статического связывания GDAL.   -  person Tsyvarev    schedule 17.12.2020
comment
@Tsyvarev, у меня нет статической библиотеки пока, просто потому, что я не хочу снова портить свою систему. Я знаю, что могу следовать этой идее, чтобы реализовать ее, но я не Не хочу идти по этому пути, не зная, куда он ведет и сколько времени это мне будет стоить :)   -  person Arnaud Becheler    schedule 18.12.2020
comment
Если вы создаете и устанавливаете GDAL статически в какой-либо пользовательский префикс установки, вы можете попросить CMake выполнить поиск этого префикса с помощью find_package(GDAL). Таким образом, CMake найдет статические библиотеки. Это то, что вы спрашиваете?   -  person Tsyvarev    schedule 18.12.2020
comment
@Tsyvarev да, это то, о чем я спрашиваю. Как только я получу статическую библиотеку, как мне попросить CMake найти статическую версию.   -  person Arnaud Becheler    schedule 18.12.2020
comment
В документации вы можете найти GDAL_DIR и GDAL_ROOT переменные, с помощью которых вы может подсказать CMake о расположении CGAL. Переменная CMAKE_PREFIX_PATH также работает для этой цели. (Переменная CMAKE_PREFIX_PATH влияет на внутреннюю функциональность find_package, поэтому она не упоминается в документации для конкретных модулей FindXXX.)   -  person Tsyvarev    schedule 18.12.2020
comment
Если я правильно понимаю, CMake построит все, что найдет в этом месте? Если код зависимости встроен в исполняемый файл, зависит только от того, является ли то, что находит CMake, общей библиотекой или статической библиотекой? Я бы подумал, что нужно добавить ключевое слово STATIC где-нибудь в проекте CMake.   -  person Arnaud Becheler    schedule 18.12.2020