Связанные библиотеки CMake не найдены - PullRequest
0 голосов
/ 18 сентября 2018

Я создал очень простой пример c ++, используя библиотеку ZeroMQ на моей машине с Linux.

Сборка проекта

Для сборки проекта я решил использовать CMake.В настоящее время мой CMakeLists.txt выглядит следующим образом:

cmake_minimum_required (VERSION 3.9)
project(QSample)

# add ZMQ cmake files and find libzmq
set (ZeroMQ_DIR "/home/vtd/DEV_JOHANN/ZEROMQ/INSTALL_CMAKE/")
find_package(ZeroMQ REQUIRED)

# include also the zmq c++ wrapper
set(SOURCES qSample.cpp /home/vtd/DEV_JOHANN/ZEROMQ/INSTALL/include/zmq.hpp)

add_executable(QSample ${SOURCES})

# add the zmq include path
target_include_directories(QSample PRIVATE "/home/vtd/DEV_JOHANN/ZEROMQ/INSTALL/include")

# add the zmq libs
link_directories("/home/vtd/DEV_JOHANN/ZEROMQ/INSTALL/lib64")

# link the libs
TARGET_LINK_LIBRARIES(QSample libzmq)

# rule to copy the bin to the install folder
install (TARGETS QSample DESTINATION bin)

Как видите, я изменил пути установки zmq по умолчанию.Это моя первая попытка использовать CMake, так что если вы обнаружите какие-либо улучшения в моем CMakeLists.txt, о которых было бы полезно знать.

Генерация Make-файлов с помощью CMake работает, и если я запускаю sudo make, он создает мой проект.После этого я побежал sudo make install.Теперь возникает моя проблема:

Запуск программы в папке сборки

Если я запускаю ./QSample в указанной папке сборки CMake, мое приложение запускается, как и ожидалось.

Выводиз ldd ./QSample:

linux-vdso.so.1 (0x00007fff78384000)
        libzmq.so.5 => /home/vtd/DEV_JOHANN/ZEROMQ/INSTALL/lib64/libzmq.so.5 (0x00007efeb3f4a000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00007efeb3cf9000)
        librt.so.1 => /lib64/librt.so.1 (0x00007efeb3af1000)
        libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00007efeb3965000)
        libm.so.6 => /lib64/libm.so.6 (0x00007efeb35d2000)
        libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007efeb35b8000)
        libc.so.6 => /lib64/libc.so.6 (0x00007efeb31f6000)
        /lib64/ld-linux-x86-64.so.2 (0x00007efeb4026000)

Запустить программу в папке установки

Если я сейчас переключусь в свою конкретную папку установки, я больше не смогу запустить ./QSample:

/ QSample: ошибка при загрузке общих библиотек: libzmq.so.5: невозможно открыть файл общего объекта: нет такого файла или каталога

Вывод ldd ./QSample:

linux-vdso.so.1 (0x00007ffd975d4000)
        libzmq.so.5 => not found
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fcac89d3000)
        librt.so.1 => /lib64/librt.so.1 (0x00007fcac87cb000)
        libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00007fcac863f000)
        libm.so.6 => /lib64/libm.so.6 (0x00007fcac82ac000)
        libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007fcac8292000)
        libc.so.6 => /lib64/libc.so.6 (0x00007fcac7ed0000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fcac8c26000)

Сейчас мне непонятно, почему я не могу запустить его в папке установки.Что мне нужно изменить в моем файле CMake?

Ответы [ 2 ]

0 голосов
/ 19 сентября 2018

(вкратце)

Добавьте следующую строку в ваш CMakeLists.txt, перед строкой add_executable :

set (CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)

(не вкратце)

Ваша проблема в обработке rpath.По умолчанию на этапе компоновки cmake инициирует размещение всех автоматически обнаруженных папок со связанными библиотеками непосредственно в исполняемую программу, используя параметр компоновщика -rpath .

(при условии, что вы используете генератор "Unix Makefiles"), если вы начнете компиляцию / ссылку с

make VERBOSE=1

во время фазы соединения, вы увидите что-то вроде

g++  [lot of everything] -Wl,-rpath,/home/vtd/DEV_JOHANN/ZEROMQ/INSTALL/lib64

это означает, что при запуске вашего исполняемого файла компоновщик во время выполнения сначала ищет в папке /home/vtd/DEV_JOHANN/ZEROMQ/INSTALL/lib64, а затем ищет $ LD_LIBRARY_PATH.Это позволяет вашей программе нормально запускаться перед установкой.

Во время установки, как часть процесса установки, эта информация извлекается из исполняемого файла, и она больше не может найти вашу библиотеку.Вы можете определить, что просматривается в процессе установки.Найдите следующее:

-- Installing: /usr/local/bin/QSample
-- Set runtime path of "/usr/local/bin/QSample" to ""

Пустые кавычки в конце означают, что rpath удален.

Одним из решений является добавление вашей папки lib в LD_LIBRARY_PATH, например:

LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/vtd/DEV_JOHANN/ZEROMQ/INSTALL/lib64 ./QSample

или:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/vtd/DEV_JOHANN/ZEROMQ/INSTALL/lib64
./QSample

Другое решение - дать CMAKE команду не удалять данные rpath.Просто добавьте следующую строку в ваш CMakeLists.txt перед строкой add_executable :

set (CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)

Эта ссылка очень подробно объясняет обработку rpath в cmake:

https://gitlab.kitware.com/cmake/community/wikis/doc/cmake/RPATH-handling

0 голосов
/ 18 сентября 2018

Вы в настоящее время делаете

install (TARGETS QSample DESTINATION bin)

Используйте следующее вместо этого (полный путь к папке вашего бина, мой - / usr / local / bin)

install(TARGETS QSample DESTINATION /usr/local/bin)

далее, когда у вас естькакое-то исполняемое место в папке bin, все, что вам нужно сделать, это написать имя исполняемого файла без ./

т.е. в вашем приглашении просто введите QSample, и оно должно работать

$QSample

Я в настоящее времяработает на Ubuntu и выше, прекрасно работает для меня.Надеюсь, это поможет.

Если вы поместите свой исполняемый файл в папку bin, вы можете запускать их из любой точки системы, не нужно специально заходить в каталог установки.

...