static link problem mit QT, QtCore, QtGui unter Unix(fedora) Qt4.8.2, GCC4.7
-
Salut Zusammen,
ich versuche mein Progrämmlein mit static Qt libs sowie asound zu linken, leider ohne Erfolg.
(shared funktioniert alles)folgende link-options habe ich gesetzt:
-lasound
-lpthread
-lQtCore
-lQtGuidann stellte ich fest das ich static libs benötige
Qt static -> compiliert und installiert
alsa -> dito (--enable-static)
glibc-static -> dito
glib2-static -> dito
libstdc++-static -> dito
(letztere drei: aktuelle versionen welche ich über yum bezog )
Alle libs liegen nun ".a" vor und werden auch gefunden (glaub ich - da keine fehlermeldung mehr vom linker kommt welche direkt fehlendes bemängelt ).wenn ich nun versuche mit -static zu linken, werde ich mit meldungen bombardiert die ich noch nicht verstehe:
( die ersten wusste ich zu behandeln, mit besorgung der static-libs )../../../../usr/local/Qt-4.8.2-static/bin/lib/libQtCore.a(qfilesystemengine_unix.o)||In function `QFileSystemEngine::resolveGroupName(unsigned int)':| qfilesystemengine_unix.cpp||warning: Using 'getgrgid_r' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking| ../../../../usr/local/Qt-4.8.2-static/bin/lib/libQtGui.a(qfiledialog.o)||In function `qt_tildeExpansion(QString const&, bool*)':| qfiledialog.cpp||warning: Using 'getpwnam_r' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking| ../../../../usr/local/Qt-4.8.2-static/bin/lib/libQtCore.a(qfilesystemengine_unix.o)||In function `QFileSystemEngine::resolveUserName(unsigned int)':| qfilesystemengine_unix.cpp||warning: Using 'getpwuid_r' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking| /usr/lib/gcc/i686-redhat-linux/4.7.0/../../../libpthread.a(libpthread.o)||In function `sem_open':| ||warning: the use of `mktemp' is dangerous, better use `mkstemp'| ../../../../usr/local/Qt-4.8.2-static/bin/lib/libQtCore.a(qelapsedtimer_unix.o)||In function `qt_gettime()':| qelapsedtimer_unix.cpp|| undefined reference to `clock_gettime'| ../../../../usr/local/Qt-4.8.2-static/bin/lib/libQtCore.a(qelapsedtimer_unix.o)||In function `QElapsedTimer::start()':| qelapsedtimer_unix.cpp|| undefined reference to `clock_gettime'| ../../../../usr/local/Qt-4.8.2-static/bin/lib/libQtCore.a(qelapsedtimer_unix.o)||In function `QElapsedTimer::restart()':| qelapsedtimer_unix.cpp|| undefined reference to `clock_gettime'| ../../../../usr/local/Qt-4.8.2-static/bin/lib/libQtCore.a(qelapsedtimer_unix.o)||In function `QElapsedTimer::nsecsElapsed() const':| qelapsedtimer_unix.cpp|| undefined reference to `clock_gettime'| ../../../../usr/local/Qt-4.8.2-static/bin/lib/libQtCore.a(qelapsedtimer_unix.o)||In function `QElapsedTimer::elapsed() const':| qelapsedtimer_unix.cpp|| undefined reference to `clock_gettime'| ../../../../usr/local/Qt-4.8.2-static/bin/lib/libQtGui.a(qapplication_x11.o)||In function `qt_x_errhandler':| qapplication_x11.cpp|| undefined reference to `XGetErrorText'| qapplication_x11.cpp|| undefined reference to `XGetErrorDatabaseText'| qapplication_x11.cpp|| undefined reference to `XGetErrorDatabaseText'| ../../../../usr/local/Qt-4.8.2-static/bin/lib/libQtGui.a(qapplication_x11.o)||In function `sm_setProperty(char const*, char const*, int, SmPropValue*) [clone .part.2]':| qapplication_x11.cpp|| undefined reference to `SmcSetProperties'| ../../../../usr/local/Qt-4.8.2-static/bin/lib/libQtGui.a(qapplication_x11.o)||In function `getXDefault(char const*, char const*, int*) [clone .constprop.102]':| qapplication_x11.cpp|| undefined reference to `XGetDefault'| qapplication_x11.cpp|| undefined reference to `FcNameConstant'| ../../../../usr/local/Qt-4.8.2-static/bin/lib/libQtGui.a(qapplication_x11.o)||In function `qt_get_net_supported()':| qapplication_x11.cpp|| undefined reference to `XGetWindowProperty'| qapplication_x11.cpp|| undefined reference to `XFree'| qapplication_x11.cpp|| undefined reference to `XGetWindowProperty'| qapplication_x11.cpp|| undefined reference to `XFree'| ../../../../usr/local/Qt-4.8.2-static/bin/lib/libQtGui.a(qapplication_x11.o)||In function `qt_get_net_virtual_roots()':| qapplication_x11.cpp|| undefined reference to `XGetWindowProperty'| qapplication_x11.cpp|| undefined reference to `XFree'| qapplication_x11.cpp|| undefined reference to `XGetWindowProperty'| qapplication_x11.cpp|| undefined reference to `XFree'| ../../../../usr/local/Qt-4.8.2-static/bin/lib/libQtGui.a(qapplication_x11.o)||In function `qt_set_input_encoding()':| qapplication_x11.cpp|| undefined reference to `XGetWindowProperty'| qapplication_x11.cpp|| undefined reference to `XFree'| ../../../../usr/local/Qt-4.8.2-static/bin/lib/libQtGui.a(qapplication_x11.o)||In function `qt_x11_apply_settings_in_all_apps()':| qapplication_x11.cpp|| undefined reference to `XChangeProperty'| ../../../../usr/local/Qt-4.8.2-static/bin/lib/libQtGui.a(qapplication_x11.o)||In function `qt_net_remove_user_time(QWidget*)':| qapplication_x11.cpp|| undefined reference to `XDeleteProperty'| qapplication_x11.cpp|| undefined reference to `XDestroyWindow'| ../../../../usr/local/Qt-4.8.2-static/bin/lib/libQtGui.a(qapplication_x11.o)||In function `qt_net_update_user_time(QWidget*, unsigned long)':| qapplication_x11.cpp|| undefined reference to `XChangeProperty'| qapplication_x11.cpp|| undefined reference to `XCreateSimpleWindow'| qapplication_x11.cpp|| undefined reference to `XChangeProperty'| qapplication_x11.cpp|| undefined reference to `XDeleteProperty'| ../../../../usr/local/Qt-4.8.2-static/bin/lib/libQtGui.a(qapplication_x11.o)||In function `qt_wstate_iconified(unsigned long)':| qapplication_x11.cpp|| undefined reference to `XGetWindowProperty'| qapplication_x11.cpp|| undefined reference to `XFree'| ../../../../usr/local/Qt-4.8.2-static/bin/lib/libQtGui.a(qapplication_x11.o)||In function `QApplicationPrivate::applyX11SpecificCommandLineArguments(QWidget*)':| qapplication_x11.cpp|| undefined reference to `XStoreName'| qapplication_x11.cpp|| undefined reference to `XChangeProperty'| qapplication_x11.cpp|| undefined reference to `XParseGeometry'| ../../../../usr/local/Qt-4.8.2-static/bin/lib/libQtGui.a(qapplication_x11.o)||In function `QX11Data::findClientWindow(unsigned long, unsigned long, bool)':| qapplication_x11.cpp|| undefined reference to `XGetWindowProperty'| qapplication_x11.cpp|| undefined reference to `XFree'| qapplication_x11.cpp|| undefined reference to `XQueryTree'| qapplication_x11.cpp|| undefined reference to `XFree'| qapplication_x11.cpp|| undefined reference to `XFree'| ../../../../usr/local/Qt-4.8.2-static/bin/lib/libQtGui.a(qapplication_x11.o)||In function `QApplication::syncX()':| qapplication_x11.cpp|| undefined reference to `XSync'| ../../../../usr/local/Qt-4.8.2-static/bin/lib/libQtGui.a(qapplication_x11.o)||In function `QApplication::beep()':| qapplication_x11.cpp|| undefined reference to `XBell'| ../../../../usr/local/Qt-4.8.2-static/bin/lib/libQtGui.a(qapplication_x11.o)||In function `QApplication::queryKeyboardModifiers()':| qapplication_x11.cpp|| undefined reference to `XQueryPointer'| ../../../../usr/local/Qt-4.8.2-static/bin/lib/libQtGui.a(qapplication_x11.o)||In function `QSmSocketReceiver::socketActivated(int)':| qapplication_x11.cpp|| undefined reference to `SmcGetIceConnection'| qapplication_x11.cpp|| undefined reference to `IceProcessMessages'| ../../../../usr/local/Qt-4.8.2-static/bin/lib/libQtGui.a(qapplication_x11.o)||In function `QSessionManager::QSessionManager(QApplication*, QString&, QString&)':| qapplication_x11.cpp|| undefined reference to `SmcOpenConnection'| qapplication_x11.cpp|| undefined reference to `SmcGetIceConnection'| qapplication_x11.cpp|| undefined reference to `IceConnectionNumber'| ../../../../usr/local/Qt-4.8.2-static/bin/lib/libQtGui.a(qapplication_x11.o)||In function `QSessionManager::~QSessionManager()':| qapplication_x11.cpp|| undefined reference to `SmcCloseConnection'| ../../../../usr/local/Qt-4.8.2-static/bin/lib/libQtGui.a(qapplication_x11.o)||In function `QSessionManager::allowsInteraction()':| qapplication_x11.cpp|| undefined reference to `SmcInteractRequest'| ../../../../usr/local/Qt-4.8.2-static/bin/lib/libQtGui.a(qapplication_x11.o)||In function `QSessionManager::allowsErrorInteraction()':| qapplication_x11.cpp|| undefined reference to `SmcInteractRequest'| ../../../../usr/local/Qt-4.8.2-static/bin/lib/libQtGui.a(qapplication_x11.o)||In function `QSessionManager::release()':| qapplication_x11.cpp|| undefined reference to `SmcInteractDone'| ||More errors follow but not being shown.| ||Edit the max errors limit in compiler options...| ||=== Build finished: 50 errors, 4 warnings ===|
kann mir wer auf die Sprünge helfen wie ich das zu verstehen habe?
Da es sich um "undefined reference" handelt, würde ich fast meinen da fehlt was...
Aber was und wie ist es zu erkennen? Ich mein ich mag euch ja nicht mit meinem Unfug belasten.Gruss Tommmy
-
Versuch mal, -lQtGui vor -lQtCore zu setzen.
-
Danke,
aber keine Änderung.
Aber meinst du das ernst? Gibt es da Abhängigkeiten in der Reihenfolge?
Tommmy
-
Es kann tatsächlich auf die Reihenfolge ankommen (aber nur bei Libs und nicht bei .o-Dateien, soweit ich weiß). Warum, weiß ich selbst nicht so genau...
-
da du Qt statisch linkst musst du selbst die Abhängikeiten von Qt zusätzlich beim linken angeben.
z.b. für die ganzen undefined reference to 'X<functioName>
musst du libX11 dazu linken (-lX11).
Und für den Rest die libSM (SM = Session Management)
-
WxSkip: auf jeden Fall gut zu wissen. Danke!
Firefly Danke,
Ich habe nun -shared -lX11 -lSM als option dahinter eingefügt.
ich bekomme es zusammengebaut, aber es läuft nicht... "process returned -1"Muss ich X11 ebenfalls static linken? (Oder eben allgemeinen die abhängigen Bibliotheken?)
Was noch interessant ist: wie kann ich die Abhängigkeiten von anderen Bibliotheken heraus bekommen? QT-Manual studieren?
Woher hast du jetzt spontant die Antwort geholt - Erfahrung und das die Funktionen sich auf Xblub referenzieren -> kann also nur X11 sein?
Hat spontan wer einen gut geschriebenen Artikel über das Linken, welchen er empfehlen würde? Hab mich noch nicht tief genug in static und shared eingearbeitet...
Gruss Tommy
-
Habs!
Also ich hab die abhängigen Libs über ldd ./myApp in der console gelisted und shared dazu gelingt. Nun geht der ganze spass.
Anmerken möchte ich hier: Wer Qt static compiliert, solle sich die ganzen CompileOptionen gründlich anschauen, was er wirklich benötigt, das spart Zeit beim Kompilieren und arbeit beim Linken.
Danke an firefly, hast mir die richtige Richtung gewiesen!
Oder gibts noch kritik an meinem Vorgehen oder Tipps?
Gruss Tommy!