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

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

Сообщение Anonymous »

Я сам создал свою общую библиотеку (например, я использую библиотеку, вычисляющую число Фибоначчи) и хочу использовать ее в другом проекте 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++»