Я кросс-компилирую проект с помощью CMake. find_library
не может найти библиотеку, расположенную в ${CMAKE_INSTALL_PREFIX}/lib
, потому что CMAKE_INSTALL_PREFIX
не добавляется к CMAKE_SYSTEM_PREFIX_PATH
, как должно согласно документация.
Причина этого в том, что я установил CMAKE_SYSTEM_NAME
на Generic
в своем файле цепочки инструментов. Я сократил файл цепочки инструментов до этой единственной команды. Почему это влияет на поведение CMAKE_INSTALL_PREFIX
?
Если я устанавливаю CMAKE_SYSTEM_NAME
на Linux
или Windows
, CMAKE_SYSTEM_PREFIX_PATH
имеет некоторую предустановку, а также CMAKE_INSTALL_PREFIX
добавляется, как и ожидалось.
Я думаю, что документация здесь неверна. Добавление CMAKE_INSTALL_PREFIX
к CMAKE_SYSTEM_PREFIX_PATH
не происходит автоматически. Это делается внутри модулей CMake, специфичных для платформ Windows и Linux (например, c:\Program Files\CMake\share\cmake-3.14\Modules\Platform\WindowsPaths.cmake на моем компьютере).
Чтобы имитировать одно и то же поведение для платформ, отличных от Windows и Linux, вы можете сделать следующее. В файле цепочки инструментов определите уникальное имя системы, а также добавьте текущий каталог в CMAKE_MODULE_PATH
, чтобы Cmake искал здесь модули:
set(CMAKE_SYSTEM_NAME "MySystem")
list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR})
Затем создайте файл платформы с именем <CMAKE_SYSTEM_NAME>.cmake
в подпапке с именем Platform
(например, Platform\MySystem.cmake
). Внутри этого файла вы можете добавить CMAKE_INSTALL_PREFIX
к CMAKE_SYSTEM_PREFIX_PATH
:
# Copied from c:\Program Files\CMake\share\cmake-3.14\Modules\Platform\WindowsPaths.cmake
if (NOT CMAKE_FIND_NO_INSTALL_PREFIX)
list(APPEND CMAKE_SYSTEM_PREFIX_PATH
# Project install destination.
"${CMAKE_INSTALL_PREFIX}"
)
if (CMAKE_STAGING_PREFIX)
list(APPEND CMAKE_SYSTEM_PREFIX_PATH
# User-supplied staging prefix.
"${CMAKE_STAGING_PREFIX}"
)
endif ()
endif ()