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