Контекст:
Я создал 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 использовать статическую версию библиотеки?
find_package(GDAL)
. Таким образом, CMake найдет статические библиотеки. Это то, что вы спрашиваете? - person Tsyvarev   schedule 18.12.2020GDAL_DIR
иGDAL_ROOT
переменные, с помощью которых вы может подсказать CMake о расположении CGAL. Переменная CMAKE_PREFIX_PATH также работает для этой цели. (ПеременнаяCMAKE_PREFIX_PATH
влияет на внутреннюю функциональностьfind_package
, поэтому она не упоминается в документации для конкретных модулей FindXXX.) - person Tsyvarev   schedule 18.12.2020STATIC
где-нибудь в проекте CMake. - person Arnaud Becheler   schedule 18.12.2020