2 Stimmen

CMake "make install" Ausgabe kann unter Redhat keine gemeinsamen Qt-Bibliotheken finden

Ich habe ein Qt-Projekt, das ich konfigurieren und bauen mit CMake. Wenn ich einfach "make" eingebe, um die Anwendung zu erstellen, wird eine Anwendung in meinem Build-Verzeichnis erstellt und alles funktioniert gut. Wenn ich jedoch "make install" eingebe, um in ein Release-Verzeichnis zu installieren, wird die resultierende ausführbare Datei nicht ausgeführt, da sie keine gemeinsam genutzten Bibliotheken finden kann. Ich erhalte eine Fehlermeldung:

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

Was macht "make install" mit der ausführbaren Datei? Ich dachte, es würde die Datei nur kopieren, aber es muss etwas mit der Datei machen. Ich versuche, beide Dateien von demselben Terminal aus auszuführen, so dass meine Umgebung dieselbe ist.

Hier ist die Ausgabe von ldd für die ausführbare Datei im Release-Verzeichnis (erzeugt von "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)

Wenn ich hingegen ldd für die ausführbare Datei im Build-Verzeichnis (das mit "make" erstellt wurde) ausführe, wird Folgendes ausgegeben:

    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)

Hier ist die CMakeLists.txt-Datei, die zur Erstellung dieser Dateien verwendet wird:

# 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 .)

Es ist wahrscheinlich nur etwas dumm, aber warum funktioniert die ausführbare Datei von "make", aber "make install" gibt einen Fehler? Die Dateien haben beide die gleiche Größe.

Danke

6voto

Silas Parker Punkte 7929

Wie Sie bemerkt haben, ist das CMake make install entfernt nicht standardisierte Build-Pfade, um sicherzustellen, dass die ausführbare Datei die Systembibliotheken verwendet und auf jedem System funktioniert, auf dem sie bereitgestellt wird.

Sie müssen Qt entweder in die Standardbibliotheksordner installieren oder den Ordner in die Systembibliothekspfade aufnehmen.

Für letzteres erstellen Sie eine Datei qt4.7.conf en /etc/ld.so.conf.d mit einer einzigen Zeile von /usr/local/Trolltech/Qt-4.7.3/lib . Dann laufen ldconfig um den Bibliothekscache aufzubauen. ausführen ldd erneut, um zu überprüfen, ob dies funktioniert hat.

2voto

atomicules Punkte 2105

In Erweiterung der Antwort von @skyhisi (die mich auf den richtigen Weg gebracht hat) können Sie auch Folgendes verwenden -DCMAKE_INSTALL_RPATH_USE_LINK_PATH:BOOL=ON als Argument für cmake auf der Befehlszeile einfügen oder SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) en CMakeLists.txt um zu verhindern, dass CMake nicht standardisierte Build-Pfade entfernt.

Dies ist der Ansatz, den ich auf NetBSD verwendet habe, wo ich genau das gleiche Problem wie @giles123 hatte; einige meiner Bibliotheken waren in /usr/pkg/lib einen systemfremden Bibliothekspfad.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X