Я сам построил свою общую библиотеку (например, я использую 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?