Предположим, общая библиотека и заголовки расположены в /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 ..
./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
Мобильная версия