Diese Website existiert nur weil wir Werbung mit AdSense ausliefern.
Bitte den AdBlocker daher auf dieser Website ausschalten! Danke.

-lqt-mt

Alles rund um die verschiedenen Konsolen und shells sowie die Programmierung unter Linux

Moderator: Moderatoren

Martin Baumann
Member
Member
Beiträge: 145
Registriert: 15. Jan 2005, 10:42
Wohnort: BW

-lqt-mt

Beitrag von Martin Baumann »

Hallo,

beim Linken meines Projektes kommt folgender Fehler:
Link: myProject
/usr/lib/gcc-lib/i586-suse-linux/3.3.4/../../../../i586-suse-linux/bin/ld: cannot find -lqt-mt
collect2: ld returned 1 exit status
Was bedeutet das?

Gruß, Karl
traffic
Guru
Guru
Beiträge: 2750
Registriert: 13. Feb 2005, 05:50

Beitrag von traffic »

Das bedeutet, dass der Linker die libqt-mt.so nicht finden kann, weil qt3-devel nicht installiert ist.
Benutzeravatar
TeXpert
Guru
Guru
Beiträge: 2166
Registriert: 17. Jan 2005, 11:22

Beitrag von TeXpert »

oder, wenn qt selber compiliert wurde keine Thread-Unterstützung compiliert wurde, dann geht nur -lqt

Code: Alles auswählen

# to resolve all your problems, try this:
HOWTO='pack c5,41*2,sqrt 7056,unpack(c,H)-2,oct 115' && perl -le "print $HOWTO"
Ich beantworte keine Supportfragen per PM!
Martin Baumann
Member
Member
Beiträge: 145
Registriert: 15. Jan 2005, 10:42
Wohnort: BW

Beitrag von Martin Baumann »

Ich habe im QT Source Verzeichnis "./configure -thread" eingegeben und danach nochmal "make" und "make install".
Das scheint funktioniert zu haben.
Schon mal vielen Dank für den Hinweis!

Danach bin ich ins Verzeichnis meines Projektes. Nach make wurde alles einwandfrei kompiliert. Beim letzten Schritt, beim Linken kamen dann seitenlang Fehler:
/home/karl/local/lib/vtk/libvtkFiltering.a(vtkImageSource.o)(.text+0x71): In function `vtkImageSource::vtkImageSource[not-in-charge]()':
: undefined reference to `vtkImageData::New()'
/home/karl/local/lib/vtk/libvtkFiltering.a(vtkImageSource.o)(.text+0x107): Infunction `vtkImageSource::vtkImageSource[in-charge]()':
: undefined reference to `vtkImageData::New()'
/home/karl/local/lib/vtk/libvtkFiltering.a(vtkImageSource.o)(.text+0x1f3): Infunction `vtkImageSource::Execute()':
: undefined reference to `vtkImageData::SetExtent(int*)'
/home/karl/local/lib/vtk/libvtkFiltering.a(vtkImageSource.o)(.text+0x201): Infunction `vtkImageSource::Execute()':
: undefined reference to `vtkImageData::AllocateScalars()'
/home/karl/local/lib/vtk/libvtkFiltering.a(vtkImageSource.o)(.text+0x5a0): Infunction `vtkImageSource::AllocateOutputData(vtkDataObject*)':
: undefined reference to `vtkImageData::SetExtent(int*)'
Um welche Art Fehler handelt es sich bei sowas? Beim Kompilieren brauchte er die Quell-Dateien von VTK. Was braucht er beim Linken? Die Libraries? Was kann da die Ursache des Fehlers sein?

Gruß, Karl
traffic
Guru
Guru
Beiträge: 2750
Registriert: 13. Feb 2005, 05:50

Beitrag von traffic »

Die VTK-Bibliothek wird nicht gefunden. Das muss nicht heißen, dass sie nicht installiert ist, vielleicht ist sie installiert und der Linker-Aufruf ist fehlerhaft.

Wie lautet denn der komplette Linker-Aufruf? Dein Ausschnitt der Fehlermeldung ist zu kurz! Ich bräuchte die komplette Befehlszeile unmittelbar vor dem Fehler.

Probier es einfach mal mit

Code: Alles auswählen

LDFLAGS=-lvtk ./configure
oder wie auch immer die Bibliothek korrekt heißt.

Alles unter der Voraussetzung, dass Du die autotools nutzt. Falls Du ein anderes Build-System nutzt, musst Du den Linker-Aufruf eben an der entsprechenden Stelle ergänzen, wo auch immer das ist.
Martin Baumann
Member
Member
Beiträge: 145
Registriert: 15. Jan 2005, 10:42
Wohnort: BW

Beitrag von Martin Baumann »

Das Ganze passiert, wenn ich einfach 'make' eingebe.
Keine Ahnung wie da der Linker-Befehl genau lautet. Wie finde ich den denn?

Insgesamt blicke ich bei den Makefiles noch nicht so ganz durch. Ich habe eine Makefile, die eine Makefile.inc öffnet und ausserdem noch in jedem Unterverzeichnis des Projektes weitere Makefiles. Wo genau finde ich dann die Linker-Anweisung?

Gruss, Karl
traffic
Guru
Guru
Beiträge: 2750
Registriert: 13. Feb 2005, 05:50

Beitrag von traffic »

Dein Build-System kenne ich leider nicht, deswegen kann ich Dir auch nicht sagen, wo der Linker-Aufruf steckt. Ginge es um autoconf, dann gäbe es den oben beschriebenen Standard-Weg, aber das ist offensichtlich nicht der Fall.

Schau die Makefiles an und versuch die Stelle zu finden, an der dieses "-lqt-mt" steht. Das ist der Linker-Aufruf für Qt. Füg an der Stelle den Aufruf für Deine Bibliothek ein, d.h. wenn die Bibliothek "libXyZ.so" heißen würde, müsstest Du "-lXyZ" einfügen.

Ist das Prinzip einigermaßen klar geworden? "lib123.so" wird mit "-l123" eingebunden, "libabc.so" mit "-labc" usw. Den Rest müsstest Du leider selbst herausfinden, da kann ich Dir leider nicht helfen, weil es sich um selbstgeschriebene Makefiles zu handeln scheint.
Benutzeravatar
TeXpert
Guru
Guru
Beiträge: 2166
Registriert: 17. Jan 2005, 11:22

Beitrag von TeXpert »

configure hat auch einen help-Mode, mach mal ein

Code: Alles auswählen

configure -?
dann steht da, wie Du Link-Pfade und Include-Pfade zu anderen Libraries mitgeben kannst.

Code: Alles auswählen

# to resolve all your problems, try this:
HOWTO='pack c5,41*2,sqrt 7056,unpack(c,H)-2,oct 115' && perl -le "print $HOWTO"
Ich beantworte keine Supportfragen per PM!
Martin Baumann
Member
Member
Beiträge: 145
Registriert: 15. Jan 2005, 10:42
Wohnort: BW

Beitrag von Martin Baumann »

Vielen Dank für Eure Tipps. Das hat mir schonmal viel weitergeholfen.
Ich konnte nun das Projekt erfolgreich kompilieren. Im Bin Verzeichnis wurde eine Datei erzeugt. Wenn ich diese ausführen will bekomme ich folgende Meldung:
error while loading shared libraries: libvtkCommon.so: cannot open shared object file: No such file or directory
Ich dachte, wenn eim Linken alles glatt läuft, wird das Programm auch laufen. Offensichtlich ist das nicht so. Ich habe nochmal nachgeprüft, dass die Datei auch existiert. Sie liegt in dem Verzeichnis, dass in den Makefiles angegeben wurde.
Mit was kann dieses Problem zu tun haben?

Gruß, Karl
Benutzeravatar
TeXpert
Guru
Guru
Beiträge: 2166
Registriert: 17. Jan 2005, 11:22

Beitrag von TeXpert »

jetzt muss das System auch noch wissen, wo es die Dateien findet, d.h. so spontan würde ich entweder ein

Code: Alles auswählen

LD_LIBRARY_PATH=%LD_LIBRARY_PATH:/deinPfadzurSO && ./meinprogramm
als 1. Lösung sehen oder
als 2. Lösung das Library-Verzeichnis in /etc/ld.so.conf aufnehmen (danach ldconfig aufrufen)

3. die Library so installieren, dass passende Symlinks in /usr/lib liegen

Code: Alles auswählen

# to resolve all your problems, try this:
HOWTO='pack c5,41*2,sqrt 7056,unpack(c,H)-2,oct 115' && perl -le "print $HOWTO"
Ich beantworte keine Supportfragen per PM!
Martin Baumann
Member
Member
Beiträge: 145
Registriert: 15. Jan 2005, 10:42
Wohnort: BW

Beitrag von Martin Baumann »

Hi,

Lösung 1 hat bei mir nicht funktioniert. Es wird der gleiche Fehler gezeigt.

Mit Lösung 2 habe ich ein Problem: Ich kann die Datei /etc/ld.so.conf nicht editieren. Ich habe ich als su eingeloogt und dann per chmod die Berechtigungen verändern wollen. Das klappt nicht.
Wie kann man diese Datei editieren?

Vielen Dank, Karl
Benutzeravatar
TeXpert
Guru
Guru
Beiträge: 2166
Registriert: 17. Jan 2005, 11:22

Beitrag von TeXpert »

als root...

Code: Alles auswählen

$ su
Password:
wopr:/home# vi /etc/ld.so.conf
anschließend ein ldconfig als root laufen lassen...

Code: Alles auswählen

# to resolve all your problems, try this:
HOWTO='pack c5,41*2,sqrt 7056,unpack(c,H)-2,oct 115' && perl -le "print $HOWTO"
Ich beantworte keine Supportfragen per PM!
traffic
Guru
Guru
Beiträge: 2750
Registriert: 13. Feb 2005, 05:50

Beitrag von traffic »

Code: Alles auswählen

LD_LIBRARY_PATH=%LD_LIBRARY_PATH:/deinPfadzurSO && ./meinprogramm
Ist das denn überhaupt richtig so? Ich würde eher eine der folgenden Möglichkeiten vorschlagen:

Code: Alles auswählen

LD_LIBRARY_PATH=/verzeichnis/in/dem/sich/libvtkCommon.so/befindet:"$LD_LIBRARY_PATH" ./programm
(in einer Zeile) oder

Code: Alles auswählen

export LD_LIBRARY_PATH=/verzeichnis/in/dem/sich/libvtkCommon.so/befindet:"$LD_LIBRARY_PATH"
./programm
(in zwei Zeilen oder mit einem "&&" dazwischen)
Benutzeravatar
TeXpert
Guru
Guru
Beiträge: 2166
Registriert: 17. Jan 2005, 11:22

Beitrag von TeXpert »

also die Reihenfolge ist egal, da die Lib vorher noch nicht exisitert kannst Du die hinten oder vorne an den ld-Path ranhängen.

der 2. Vorschlag

Code: Alles auswählen

LD_LIBRARY_PATH=/verzeichnis/in/dem/sich/libvtkCommon.so/befindet:"$LD_LIBRARY_PATH" ./programm
macht keinen Sinn, denn dann würdest Du ja auch ./programm mit an die Env-Variable ranhängen, also entweder 2 zeilen, dann wirds für die aktuelle Shell gesetzt oder mit &&, dann wirds auch für die aktuelle Shell gesetzt und wenn das klappt gleich das programm ausführen

Code: Alles auswählen

# to resolve all your problems, try this:
HOWTO='pack c5,41*2,sqrt 7056,unpack(c,H)-2,oct 115' && perl -le "print $HOWTO"
Ich beantworte keine Supportfragen per PM!
Martin Baumann
Member
Member
Beiträge: 145
Registriert: 15. Jan 2005, 10:42
Wohnort: BW

Beitrag von Martin Baumann »

Die Sache mit der ld.so.conf hat nun geklappt. Ich musste mehrere Pfade anfügen, die verschiedene Libs beinhalteten.

Jetzt läuft das Programm!

Vielen Dank für Eure Hilfe!!!

Ich habe mal wieder was dazu gelernt.

Gruss, Karl
traffic
Guru
Guru
Beiträge: 2750
Registriert: 13. Feb 2005, 05:50

Beitrag von traffic »

@TeXpert: Dass die Reihenfolge egal ist, ist schon klar, aber bist Du Dir bei der anderen Sache wirklich sicher?

Code: Alles auswählen

$ LC_ALL=de_DE.UTF-8 man
Welche Manual-Seite wollen Sie haben?

$ LC_ALL=C man
What manual page do you want?
=> Umgebungsvariable wird an das Programm übergeben, wenn man vor den Befehl einfach die Umgebungsvariable setzt, mit einem Leerzeichen dazwischen.

Code: Alles auswählen

$ LC_ALL=C && man
Welche Manual-Seite wollen Sie haben?
=> Umgebungsvariable wird nicht an das Programm übergeben, wenn man die Umgebungsvariable setzt und dann das Programm getrennt in einem eigenen Befehl aufruft, weil die Umgebungsvariable nicht exportiert wird und nur innerhalb der Shell gilt, nicht aber in Programmen, die aus dieser Shell gestartet wurden.

Code: Alles auswählen

$ export LC_ALL=C && man
What manual page do you want?
=> So geht es natürlich wieder, weil die Umgebungsvariable auch korrekt exportiert wird, allerdings darf man dann nicht vergessen, sie bei Bedarf wieder zurückzusetzen.

Letzteres, also das Zurücksetzen, ist nach der allerersten Methode wiederum nicht notwendig, weil die Umgebungsvariable auf dem Weg nur an das gestartete Programm übergeben wird und nicht innerhalb der Shell gilt.

Also zusammengefasst:

1. Methode: Umgebungsvariable gilt nur für das gestartete Programm, Shell bleibt "sauber"

2. Methode: Umgebungsvariable gilt nur für die Shell selbst, nicht für daraus gestartete Programme

3. Methode: Umgebungsvariable gilt sowohl für die Shell selbst als auch für daraus gestartete Programme
TeXpert hat geschrieben:[...] macht keinen Sinn, denn dann würdest Du ja auch ./programm mit an die Env-Variable ranhängen [...]
Nein, stimmt nicht. Dafür ist ja das Leerzeichen da. Bestandteil der Umgebungsvariable wäre der Befehl nur, wenn entweder das Leerzeichen nicht da wäre oder wenn man es durch Quoting überschreiben würde.

Probier es einfach mal aus, ich meine wirklich Recht zu haben (nicht überheblich gemeint ;)). Zumindest in der bash lässt sich das alles so nachvollziehen.
Benutzeravatar
TeXpert
Guru
Guru
Beiträge: 2166
Registriert: 17. Jan 2005, 11:22

Beitrag von TeXpert »

traffic hat geschrieben:@TeXpert: Dass die Reihenfolge egal ist, ist schon klar, aber bist Du Dir bei der anderen Sache wirklich sicher?
ich war mir sicher... hmm ... jetzt verwirren mich die Bash-Manpage und meine Experimente, also: erst mal Zustimmung es gibt Situationen in denen das Stimmt (nach deinem Experiment und nach man bash:
SHELL GRAMMAR
Simple Commands
A simple command is a sequence of optional variable assignments followed by blank-separated words and redi-
rections, and terminated by a control operator. The first word specifies the command to be executed, and is
passed as argument zero. The remaining words are passed as arguments to the invoked command.

sowie
Pipelines
[...]
Each command in a pipeline is executed as a separate process (i.e., in a subshell).

Lists
A list is a sequence of one or more pipelines separated by one of the operators ;, &, &&, or ||, and option-
ally terminated by one of ;, &, or <newline>.
das würde das erklären, damit hättest Du recht, dass Deine Variante auch richtig ist :)

auf der anderen Seite, werden Variablen ja an Subshells vererbt... sofern also eine Subshell (wie bie der Pipeline( gestartet wird müsste das dennoch funktionierten:

Code: Alles auswählen

$ FORSUBSHELL="Hallo"
$ /bin/echo "$(/bin/echo "$FORSUBSHELL")"
Hallo
die Variable stimmt auch in der Subshell, analog natürlich auch mit der manpage:

erst mal mit /bin/echo:

Code: Alles auswählen

$ echo "$LC_ALL"
C
$ LC_ALL=de_DE.utf-8 && echo "$LC_ALL"
de_DE.utf-8
$ LC_ALL=de_DE.utf-8 && /bin/echo "$LC_ALL"
de_DE.utf-8
$ LC_ALL=C && /bin/echo "$LC_ALL"
C
jetzt mit man:

Code: Alles auswählen

$ LANG=C && man
What manual page do you want?
$ LANG=de_DE@euro && man
Welche Manual-Seite wollen Sie haben?
So, also dürfte das sowei Äquivalent sein, ausser dass bei der Pipeline das Set auch in der aktuellen Shell stattfindet und bei dem Simple Comand sich nur auf das Command bezieht.

*Puh* ich hab mich schon gewundert, warum das bei mir immer mit dem && geklappt hat ;) aber es lässt sich ja wunderbar erklären....




So jetzt kommt aber das ABER, das ganz große ABER :)

an sich müsste dann

Code: Alles auswählen

$ TEST="foobar" /bin/echo "$TEST"
"foobar" ausgeben, denn echo (nicht das builtin sondern externes Programm) bekommt ja die Umgebung mittgeteilt aber...

Code: Alles auswählen

$ /bin/echo "$TEST"

$ TEST="foobar" /bin/echo "$TEST"

$ /bin/echo "$TEST"

$ TEST="foobar" && /bin/echo "$TEST"
foobar
$ /bin/echo "$TEST"
foobar
$Test ist initial nicht gesetzt, ich verwende /bin/echo um nicht das bash-Builtin zu verwenden bei dem Simple Command bekommt das Programm davon nichts mit, bei der Pipeline schon, da erst die aktuelle Shell manipuliert wird und anschließend alles an die Subshell weitergegeben wird...

um es kurz zu machen: ich bin z.zt. etwas verwirrt :) zusammengefasst sollte nach manpage also auf jeden beides funktionieren, wobei ich den 2. Test, der bei mir Zweifel verursacht so spontan noch nciht erklären kann...

Code: Alles auswählen

# to resolve all your problems, try this:
HOWTO='pack c5,41*2,sqrt 7056,unpack(c,H)-2,oct 115' && perl -le "print $HOWTO"
Ich beantworte keine Supportfragen per PM!
Martin Baumann
Member
Member
Beiträge: 145
Registriert: 15. Jan 2005, 10:42
Wohnort: BW

Beitrag von Martin Baumann »

hab doch noch ein Problem:

ich habe ein Shell-Skript 'myProg.sh' erstellt und folgendes hineingeschrieben:

LD_LIBRARY_PATH=/home/martin/local/lib/vtk:/home/martin/local/lib/GL ./myProgBin

und habe diese Datei ins Bin-Verzeichnis des Programmes gelegt.
Wenn ich diesen Skript nun aufrufe (./myProg.sh) startet das Programm. Allerdings erhalte ich in der Konsole noch den Fehler:
./myProg.sh: line 1: 10494 Ungültiger Maschinenbefehl LD_LIBRARY_PATH=/home/martin/local/lib/vtk:/home/martin/local/lib/GL ./myProgBin
Was hat das zu bedeuten?

Gruss, Martin
Benutzeravatar
TeXpert
Guru
Guru
Beiträge: 2166
Registriert: 17. Jan 2005, 11:22

Beitrag von TeXpert »

line 1 in der Fehlermeldung deutet darauf hin, dass Du keinen Shebang als 1. zeile geschrieben hast, mach mal ein

Code: Alles auswählen

#!/bin/bash
als 1. Zeile.

PS: funktioniert es denn mit diesem simplecommand als Eingabeaufforderung?

Code: Alles auswählen

# to resolve all your problems, try this:
HOWTO='pack c5,41*2,sqrt 7056,unpack(c,H)-2,oct 115' && perl -le "print $HOWTO"
Ich beantworte keine Supportfragen per PM!
Martin Baumann
Member
Member
Beiträge: 145
Registriert: 15. Jan 2005, 10:42
Wohnort: BW

Beitrag von Martin Baumann »

Perfekt! Kein Fehler mehr.
Das Teil macht genau was es soll!
Danke,

Martin
Antworten