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