У меня есть установка cmake, которая создает исполняемый файл и общую библиотеку. Я использую нестандартный префикс установки и хочу испечь RPATH в исполняемый файл. Чтение множества предыдущих вопросов, а также вики по программному обеспечению приводит меня к следующему:
Топ CMakeLists.txt:
cmake_minimum_required( VERSION 3.14 )
project( cmakeprogram VERSION 1.0 )
add_executable( program program.cxx )
set( CMAKE_RPATH "${CMAKE_INSTALL_PREFIX}/lib" )
set( CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib" )
set( CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE )
add_subdirectory( lib )
target_include_directories( auxlib PUBLIC "${CMAKE_CURRECT_SOURCE_DIR}" )
target_link_libraries( program PUBLIC auxlib )
install( TARGETS program DESTINATION . )
Библиотека:
cmake_minimum_required( VERSION 3.14 )
project( auxlib )
set( CMAKE_RPATH "${CMAKE_INSTALL_PREFIX}/lib" )
set( CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib" )
set( CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE )
add_library( auxlib SHARED
aux.cxx aux.h )
target_include_directories( auxlib PUBLIC "${CMAKE_CURRECT_SOURCE_DIR}" )
install( TARGETS auxlib DESTINATION lib )
Запуск ldd в программе (SuSe linux, если это имеет значение) в расположении build и isntall соответственно дает:
build
libauxlib.so => /stuff/build-publiclib/lib/libauxlib.so (0x00002ad64984c000)
prefix
libauxlib.so => not found
Да, я читал https://gitlab.kitware.com/cmake/community/-/wikis/doc/cmake/RPATH-обработка, но 1. это похоже на cmake 2. что угодно и 2. все еще не дает мне правильного решения.
Вот оно. Спасибо. Если вы сделаете это ответом, я приму его.
Из статьи это не так очевидно, но переменные CMAKE_INSTALL_RPATH
и CMAKE_INSTALL_RPATH_USE_LINK_PATH
должны быть установлены до создание цели:
cmake_minimum_required( VERSION 3.14 )
project( cmakeprogram VERSION 1.0 )
# All further targets on installation will have given RPATH.
set( CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib" )
add_executable( program program.cxx )
add_subdirectory( lib )
Забавно, что даже документация по переменной CMAKE_INSTALL_RPATH вводит в заблуждение:
This is used to initialize the target property
INSTALL_RPATH
for all targets.
Но описание INSTALL_RPATH правильно описывает ситуацию:
This property is initialized by the value of the variable
CMAKE_INSTALL_RPATH
if it is set when a target is created.
Фактически, в CMake инициализация большинства целевых свойств из переменных следует пункту, выделенному выше жирным шрифтом.
Из статьи это не так очевидно, но переменные
CMAKE_INSTALL_RPATH
иCMAKE_INSTALL_RPATH_USE_LINK_PATH
должны быть установлены до создания цели (add_executable( program program.cxx )
в вашем коде). Что касаетсяCMAKE_RPATH
, то эта переменная не имеет особого значения для CMake.