Seite 1 von 1

Incompatible Qt Libaray

Verfasst: 25. April 2013 15:52
von rafael9707s
Ich hatte Qt selber kompilet weil die Qt Multimedia weder bei Ubuntu oder Debian dabei ist
Die Anwendung wurde erfolgrech kompilet die ich machen wollte, aber da kam der eine Fehler..

Code: Alles auswählen

qt@keppe:~/projects/build-KeppeChatClient-Qt_4_8_4_Keppe_Edition_amd64-Release$ ./KeppeChatClient
Cannot mix incompatible Qt library (version 0x40803) with this library (version 0x40804)
Abgebrochen (Speicherabzug geschrieben)
qt@keppe:~/projects/build-KeppeChatClient-Qt_4_8_4_Keppe_Edition_amd64-Release$  
Und zwar versucht mein Linux die Qt 4.8.3 für die anderen zu nehmen, nur die Multimedia nehmt Qt 4.8.4

Wie erzwinge ich meine Anwendung die Komponeten in den Ordner zu nehmen wo die Anwendung läuft.

Bevor es bei mir nicht geht mach ich nebend kein .deb Paket.

Re: Incompatible Qt Libaray

Verfasst: 25. April 2013 19:34
von Christian81
Stichwort LD_LIBRARY_PATH und LD_RUN_PATH

Re: Incompatible Qt Libaray

Verfasst: 25. April 2013 19:46
von rafael9707s
ja, das habe ich ja schon in ein Shell Skript versucht, mit LD_RUN_PATH habe ich es gemacht, das hatte ich gerade probiert
gibt es sonst irgendwie eine Möglichkeit direkt die Datei zu erzwingen oder so..

Das Problem besteht weiterhin mit den Incompatible..

Re: Incompatible Qt Libaray

Verfasst: 25. April 2013 20:02
von Christian81
LD_RUN_PATH ist keine Umgebungsvariable und wenn Du LD_LIBRARY_PATH richtig setzt dann wird auch die richtige Library angezogen.

Re: Incompatible Qt Libaray

Verfasst: 25. April 2013 20:05
von rafael9707s
Könntest du mir ein Beispiel Skript geben, weil es währe sehr nett :)

Re: Incompatible Qt Libaray

Verfasst: 25. April 2013 22:06
von Christian81
export LD_LIBRARY_PATH=/pfad/zu/qt

Re: Incompatible Qt Libaray

Verfasst: 26. April 2013 14:43
von RHBaum
Wie erzwinge ich meine Anwendung die Komponeten in den Ordner zu nehmen wo die Anwendung läuft.
Beschaeftige dich mal mit dem LD mechanismus, und wie das unter linux funktioniert.

Wenn du selber linkst, kannst du in deinem configure, oder buildtool, je nachdem was du verwendest, selektiv die genaue version bestimmen ...
beispielsweisse kannst du auf 4.8.3 setzen, dann nimmt er nur die 4.8.3
setzt du auf 4.8, nimmt er die neuste 4.8er die du installiert hasst, waere dann 4.8.4 vielleicht, oder gar 4.8.6 (je nachdem was dein packetmanager installiert hat)
setzt du nur auf 4 ... wuerde er auch die die neuste 4er nehmen, da es noch keine hoehere als 4.8 gibt, wuerde es auch die neuste 4.8er ....
usw.
Das wenn du die System libs verwenden willst ...

Wenn du deine eigenen verwenden willst
um die gleichen QT libs anzuziehen, wuerd ich aber nicht dein System mit dem LD verbiegen ....
Du hasst doch deine selbstcompilierten QT module in einem seperaten verzeichniss liegen, oder hasst die "schon" ins LD system integriert?
Wenn nicht, musst qmake "nur" beibringen, nicht im LD zu suchen, sondern in deinem eigenen Pfad ...
kenn mich mit qmake nicht so aus, aber es wird sicher ne möglichkeit geben, systembibliothek verzeichnisse auszuschleissen und eigene hinzuzunehmen.
Gilt dann nur fuer dein project (.pro)...

Besser waer, nen packet zu finden, womit qtmultimedia auf dein system ueber den packagemanger bekommst ... sonst muesstest wenn dein eigenes project distribitueren willst, immer ne eigene version der qt mit ausliefern ... weil ueber die LD pfade sonst mit grosser wahrscheinlichkeit ichmatsch kommt ... oder unaufloesbare abhaengigkeiten.

Ciao ...







Ciao ...

Re: Incompatible Qt Libaray

Verfasst: 26. April 2013 15:15
von rafael9707s
Also er darf die "nicht" von dpkg installierten Komponeten nehmen
Ich will die 4.8.4 erzwingen, sonst geht das nicht, weil er bei mir die Qt 4.8.3 mit meine Qt 4.8.4 mischt

Re: Incompatible Qt Libaray

Verfasst: 29. April 2013 10:40
von RHBaum
Ist statisch linken (keine LGPL,also GPL / Commerziell ) für dich ne Option ?

Ansonsten:
Ich will die 4.8.4 erzwingen
Ist wohl eher das Problem !

Also ein packet zu bauen, was dir eine qt version (4.8.4) ordnungsgemäss in die LD Pfade einbaut, würd ich dir abraten. Lass das lieber die Package-Maintainer der Distries machen :-)

ALso musst sicherstellen, das dein Binary deine (lokale) Version der QT komplett anzieht.

kompilierst du dazu die (komplette) Qt selber ?
Da gäbs Wege, ueber prefix und Postfix variablen eindeutige Dateiindentifizierer zu generieren, so das deine version der qt sich namentlich von dem des Systems nicht nur durch die version unterscheidet.
Macht vielleicht einiges "ersichtlicher" ansonsten ists aber nicht wirklich notig.

Generell musst du nur dafür sorgen, das deine version der qt vor der im system angezogen wird ....

zur compile/linkzeit ist klar, wie auf die richtigen haeder und libs verweisst ?

LD_LIBRARY_PATH kommt zur laufzeit zum tragen, und bestimmt, wie und in welcher reihenfolge die Pfade nach den "shared objects" durchsucht werden.
Das heisst, du musst zur laufzeit deines binaries die "LD_LIBRARY_PATH" modifiziert haben ....
(Bei Debian/Ubuntu zumindest muss dein Pfad vor dem rest stehen, also deine angaben vorn dran haengen.
Keine ahnung wie es bei anderen Distries war ... in der vergangenheit hab ich eher die erfahrung gemacht, das sich alles immer irgendwie anders verhaelt :-) hab allerdings lange auch nix mehr mit Linux gemacht. )

Leider "linkst" du wahrscheinlich gegen die .so, so dass die shared libs ueber den startcode angezogen wird. Aka du hasst kaum möglichkeiten in deinem programm/binary davor irgendwelchen code auszufuehren und die LD_LIBRARY_PATH zu modifizieren.

Einfachster und unkonventionellster weg, zum entwickeln sowieso .... binary ueber startscript starten, was die Variable modifiziert ....

Machen auch viele Linux programme und distitrubutieren die so .... Ich finds eher unelegant.
Ich wuerd nen 2tes Binary spendieren, was deine eigenetliches binary startet und vorher alles richtig einstellt ....

Ciao ...