Вывод CMake "make install" не может найти общие библиотеки Qt под Redhat - PullRequest
2 голосов
/ 01 ноября 2011

У меня есть проект Qt, который я конфигурирую и собираю с использованием CMake.Когда я просто набираю «make» для сборки приложения, оно создает приложение в моей директории сборки, и все работает нормально.Однако, когда я набираю «make install» для установки в каталог выпуска, полученный исполняемый файл не запускается, потому что не может найти общие библиотеки.Я получаю сообщение об ошибке:

release/testapp: error while loading shared libraries: libQtGui.so.4: cannot open shared     object file: No such file or directory

Что делает «make install» с исполняемым файлом?Я думал, что это будет просто скопировать файл, он должен что-то делать в файл.Я пытаюсь выполнить оба файла с одного и того же терминала, поэтому моя среда одинакова.

Вот вывод ldd для исполняемого файла в каталоге release (сгенерированный из "make install"):

    libQtGui.so.4 => not found
    libQtCore.so.4 => not found
    libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00906000)
    libm.so.6 => /lib/tls/libm.so.6 (0x00695000)
    libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x008fa000)
    libc.so.6 => /lib/tls/libc.so.6 (0x00567000)
    /lib/ld-linux.so.2 (0x00548000)

Принимая во внимание, что если я запускаю ldd на исполняемом файле в каталоге сборки (создан из "make"), он выводит следующее:

    libQtGui.so.4 => /usr/local/Trolltech/Qt-4.7.3/lib/libQtGui.so.4 (0x00560000)
    libQtCore.so.4 => /usr/local/Trolltech/Qt-4.7.3/lib/libQtCore.so.4 (0x00111000)
    libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x003ec000)
    libm.so.6 => /lib/tls/libm.so.6 (0x004b7000)
    libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x004da000)
    libc.so.6 => /lib/tls/libc.so.6 (0x033fe000)
    libpthread.so.0 => /lib/tls/libpthread.so.0 (0x004e4000)
    libgthread-2.0.so.0 => /usr/lib/libgthread-2.0.so.0 (0x004f6000)
    libglib-2.0.so.0 => /usr/lib/libglib-2.0.so.0 (0x02e76000)
    libpng12.so.0 => /usr/lib/libpng12.so.0 (0x004fa000)
    libz.so.1 => /usr/lib/libz.so.1 (0x0051e000)
    libfreetype.so.6 => /usr/lib/libfreetype.so.6 (0x02df6000)
    libSM.so.6 => /usr/X11R6/lib/libSM.so.6 (0x0052e000)
    libICE.so.6 => /usr/X11R6/lib/libICE.so.6 (0x022ac000)
    libXrender.so.1 => /usr/X11R6/lib/libXrender.so.1 (0x00537000)
    libfontconfig.so.1 => /usr/lib/libfontconfig.so.1 (0x02442000)
    libXext.so.6 => /usr/X11R6/lib/libXext.so.6 (0x0218a000)
    libX11.so.6 => /usr/X11R6/lib/libX11.so.6 (0x03937000)
    libdl.so.2 => /lib/libdl.so.2 (0x0053f000)
    librt.so.1 => /lib/tls/librt.so.1 (0x02238000)
    /lib/ld-linux.so.2 (0x00548000)
    libexpat.so.0 => /usr/lib/libexpat.so.0 (0x02377000)

Вот файл CMakeLists.txt, используемый для создания этих файлов:

# CMakeLists.txt

cmake_minimum_required(VERSION 2.8)

project(testapp)

set(CMAKE_VERBOSE_MAKEFILE OFF)

find_package(Qt4 REQUIRED)

set (CMAKE_C_FLAGS "-m32 -g")
set (CMAKE_CXX_FLAGS "-m32 -g")
set (CMAKE_INSTALL_PREFIX release)  

set(PROGNAME testapp)

add_definitions(-Wall)

set(testapp_SRCS
  main.cpp
  testapp.cpp
)

set(testapp_MOC_HDRS
  testapp.h
)

set(QT_USE_QTGUI TRUE)

include(${QT_USE_FILE})

include_directories(
  ${CMAKE_CURRENT_BINARY_DIR}
  ${CMAKE_CURRENT_SOURCE_DIR}
)

qt4_wrap_cpp(testapp_MOC_SRCS ${testapp_MOC_HDRS})

add_executable(${PROGNAME}
  ${testapp_SRCS}
  ${testapp_MOC_SRCS}
)

target_link_libraries(${PROGNAME}
  ${QT_LIBRARIES}
)

install(TARGETS ${PROGNAME} DESTINATION .)

Возможно, это просто что-то глупое, но почему исполняемый файл из "make" работает, но "make install" выдает ошибку?Оба файла имеют одинаковый размер.

Спасибо

Ответы [ 2 ]

5 голосов
/ 21 ноября 2011

Как вы заметили, команда CMake make install удаляет нестандартные пути сборки, чтобы гарантировать, что исполняемый файл будет использовать системные библиотеки и работать в любой системе, в которой он развернут.

Вам нужно либо установить Qt в стандартные папки библиотеки, либо добавить папку в пути к системным библиотекам.

Чтобы сделать последнее, создайте файл qt4.7.conf в /etc/ld.so.conf.d с одной строкой /usr/local/Trolltech/Qt-4.7.3/lib. Затем запустите ldconfig, чтобы построить кеш библиотеки. Запустите ldd еще раз, чтобы убедиться, что это сработало.

2 голосов
/ 15 апреля 2014

Расширяя ответ @skyhisi (именно это указало мне правильное направление), вы также можете использовать -DCMAKE_INSTALL_RPATH_USE_LINK_PATH:BOOL=ON в качестве аргумента для cmake в командной строке или включить SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) в CMakeLists.txt для предотвращения CMakeот удаления нестандартных путей сборки.

Это подход, который я использовал в NetBSD, когда у меня возникла та же проблема, что и у @ giles123;некоторые из моих библиотек были в /usr/pkg/lib, несистемный путь к библиотеке.

...