• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

-lqt-mt

TeXpert

Guru
oder, wenn qt selber compiliert wurde keine Thread-Unterstützung compiliert wurde, dann geht nur -lqt
 
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
 
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:
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.
 
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
 
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.
 

TeXpert

Guru
configure hat auch einen help-Mode, mach mal ein
Code:
configure -?
dann steht da, wie Du Link-Pfade und Include-Pfade zu anderen Libraries mitgeben kannst.
 
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
 

TeXpert

Guru
jetzt muss das System auch noch wissen, wo es die Dateien findet, d.h. so spontan würde ich entweder ein
Code:
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
 
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
 

TeXpert

Guru
als root...


Code:
$ su
Password:
wopr:/home# vi /etc/ld.so.conf

anschließend ein ldconfig als root laufen lassen...
 
Code:
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:
LD_LIBRARY_PATH=/verzeichnis/in/dem/sich/libvtkCommon.so/befindet:"$LD_LIBRARY_PATH" ./programm
(in einer Zeile) oder
Code:
export LD_LIBRARY_PATH=/verzeichnis/in/dem/sich/libvtkCommon.so/befindet:"$LD_LIBRARY_PATH"
./programm
(in zwei Zeilen oder mit einem "&&" dazwischen)
 

TeXpert

Guru
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:
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
 
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
 
@TeXpert: Dass die Reihenfolge egal ist, ist schon klar, aber bist Du Dir bei der anderen Sache wirklich sicher?
Code:
$ 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:
$ 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:
$ 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 schrieb:
[...] 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.
 

TeXpert

Guru
traffic schrieb:
@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:
$ 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:
$ 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:
$ 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:
$ TEST="foobar" /bin/echo "$TEST"
"foobar" ausgeben, denn echo (nicht das builtin sondern externes Programm) bekommt ja die Umgebung mittgeteilt aber...

Code:
$ /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...
 
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
 

TeXpert

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

Code:
#!/bin/bash
als 1. Zeile.

PS: funktioniert es denn mit diesem simplecommand als Eingabeaufforderung?
 
Oben