Почему CMake спроектирован так, что при установке удаляется путь выполненияC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Почему CMake спроектирован так, что при установке удаляется путь выполнения

Сообщение Anonymous »

Я создал общую библиотеку (например, fib для вычисления числа Фибоначчи) и хочу использовать ее в другом проекте C++, созданном CMake.
Предположим, общая библиотека и заголовки расположены в /path/to/my/lib, общая библиотека libfib.so находится в /path/to/my/lib/lib, а заголовок fib.h в /path/to/my/lib/include. Проект, который будет использовать библиотеку, находится в /path/to/my/project.
Вот мой исходный файл CMakeLists.txt:

Код: Выделить всё

cmake_minimum_required(VERSION 3.2)
project(learn-lib)
set(CMAKE_CXX_FLAGS "-std=c++11 ${CMAKE_CXX_FLAGS}")
set(FIB_INCLUDE "${FIB_PREFIX}/include")
set(FIB_LIB "${FIB_PREFIX}/lib")
set(EXE mybin)
include_directories(${FIB_INCLUDE})
link_directories(${FIB_LIB})
add_executable(${EXE} main.cpp)
target_link_libraries(${EXE} fib)
install(TARGETS ${EXE} RUNTIME DESTINATION bin)
Я использую этот скрипт для сборки и установки своего проекта:

Код: Выделить всё

mkdir -p build_dir
cd build_dir
cmake -DFIB_PREFIX=/path/to/my/lib \
-DCMAKE_INSTALL_PREFIX=/path/to/my/project \
..
make
make install
cd ..
После запуска сценария установки я получаю два исполняемых файла: один в build_dir, другой в пути к месту установки/to/my/project/bin. Когда я запускаю программу в build_dir, все в порядке, но при запуске установленной программы я получаю:

./bin/mybin: ошибка при загрузке общих библиотек: libfib.so: невозможно открыть общий объектный файл: такого файла или каталога нет

После некоторого поиска в Google и stackoverflow кажется, что CMake удалил путь поиска во время выполнения который привязан к исполняемому файлу при сборке. Я нашел два обходных пути:
  • добавьте путь к libfib.so в переменную среды LD_LIBRARY_PATH.
  • добавьте set_target_properties(${EXE} PROPERTIES INSTALL_RPATH_USE_LINK_PATH TRUE) в мой CMakeLists.txt.
Итак, мои вопросы:
  • Почему CMake устроен именно так? Зачем при установке удалять путь выполнения из исполняемых файлов вместо того, чтобы просто копировать построенные исполняемые файлы в место установки или что-то еще, сохраняя путь ссылки для установленной программы?
  • Как лучше всего (или существует ли лучшая практика) избежать этой проблемы? Чтобы установить среду или добавить set_target_properties(...) в CMakeLists.txt ?


Подробнее здесь: https://stackoverflow.com/questions/324 ... installing
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»