Guten Tag Habe eine Frage zum einbinden einer Library. in /usr/local/lib hab ich eine library zur Soundprogrammierung. ->sndobj muß ich diese Bibliothek beim starten von g++ extra eingeben ? so hab ich es versucht: g++ -lsndobj -L/usr/local/lib MyClass.cpp -o MyClass bekomme aber die Fehlermeldung undefined reference to `SndWave::SndWave(char *, short, short, short, SndObj **, float, int, float) Was ist falsch ? Der Code oder das Fehlen der Bibliothek. Greetns TOM
On 21 Mar 2003 at 9:55, thomas gorbach wrote:
Guten Tag
Habe eine Frage zum einbinden einer Library.
in /usr/local/lib hab ich eine library zur Soundprogrammierung. ->sndobj muß ich diese Bibliothek beim starten von g++ extra eingeben ?
so hab ich es versucht:
g++ -lsndobj -L/usr/local/lib MyClass.cpp -o MyClass
bekomme aber die Fehlermeldung
undefined reference to `SndWave::SndWave(char *, short, short, short, SndObj **, float, int, float)
Was ist falsch ? Der Code oder das Fehlen der Bibliothek.
Moin, was passiert denn bei g++ -lgipsnich -L/usr/local/lib MyClass.cpp -o MyClass ? Sieht die Fehlermeldung bei einer sicher fehlenden Bibliothek genau so aus? Poste mal bitte den Header der Konstruktor-Definition aus der cpp- Datei. Grüße Stefan
Am Fre, 2003-03-21 um 09.55 schrieb thomas gorbach:
Guten Tag
Habe eine Frage zum einbinden einer Library.
in /usr/local/lib hab ich eine library zur Soundprogrammierung. ->sndobj muß ich diese Bibliothek beim starten von g++ extra eingeben ?
Ja.
so hab ich es versucht:
g++ -lsndobj -L/usr/local/lib MyClass.cpp -o MyClass
g++ -L<verzeichnis> -l<lib> ... Der Pfad zur Lib (-L) muss vor der Lib (-l) stehen. Ralf
Ralf Corsepius wrote:
Am Fre, 2003-03-21 um 09.55 schrieb thomas gorbach:
Guten Tag
Habe eine Frage zum einbinden einer Library.
in /usr/local/lib hab ich eine library zur Soundprogrammierung. ->sndobj muß ich diese Bibliothek beim starten von g++ extra eingeben ?
Ja.
so hab ich es versucht:
g++ -lsndobj -L/usr/local/lib MyClass.cpp -o MyClass
g++ -L<verzeichnis> -l<lib> ...
Der Pfad zur Lib (-L) muss vor der Lib (-l) stehen.
Ralf
Nein leider - auch das gibt die gleiche Fehlermeldung. undefined reference to `SndWave::SndWave(char *, short, short, short, SndObj **, float, int, float) Konstruktor ist: SndWave(char* name, short mode, short channels=1, short bits=16, SndObj** inputlist=0, float spos= 0.f, int vecsize=DEF_VECSIZE, float sr=DEF_SR) ??? TOM
Am Fre, 2003-03-21 um 11.40 schrieb thomas gorbach:
Ralf Corsepius wrote:
Am Fre, 2003-03-21 um 09.55 schrieb thomas gorbach:
Guten Tag
Habe eine Frage zum einbinden einer Library.
in /usr/local/lib hab ich eine library zur Soundprogrammierung. ->sndobj muß ich diese Bibliothek beim starten von g++ extra eingeben ?
Ja.
so hab ich es versucht:
g++ -lsndobj -L/usr/local/lib MyClass.cpp -o MyClass
g++ -L<verzeichnis> -l<lib> ...
Der Pfad zur Lib (-L) muss vor der Lib (-l) stehen.
Ralf
Nein leider - Dann ist irgendwas an deinem Code fehlerhaft.
auch das gibt die gleiche Fehlermeldung. undefined reference to `SndWave::SndWave(char *, short, short, short, SndObj **, float, int, float)
Konstruktor ist:
SndWave(char* name, short mode, short channels=1, short bits=16, SndObj** inputlist=0, float spos= 0.f, int vecsize=DEF_VECSIZE, float sr=DEF_SR)
Steckt der Konstruktor auch in der lib (man nm, man c++filt)? Ralf
Ralf Corsepius
g++ -lsndobj -L/usr/local/lib MyClass.cpp -o MyClass
g++ -L<verzeichnis> -l<lib> ...
Der Pfad zur Lib (-L) muss vor der Lib (-l) stehen.
Ralf
Nein leider - Dann ist irgendwas an deinem Code fehlerhaft.
Ihr habt alle was übersehen :) libsndobj.a ist eine statische Bibliothek, ergo *muss* sie _nach_ dem Objekt angegeben werden, welches Funktionen aus ihr benötigt. Nur bei dynamischen ist es egal. Ich gehe fast jede Wette ein, dass ein g++ -L/usr/local/lib -o MyClass MyClass.cpp -lsndobj funktioniert. Philipp -- Philipp Thomas Arbeit: pthomas@suse.de Entwicklung, SuSE Linux AG Privat: pth@t-link.de
Philipp Thomas wrote:
Ralf Corsepius
[21 Mar 2003 12:38:54 +0100]: g++ -lsndobj -L/usr/local/lib MyClass.cpp -o MyClass
g++ -L<verzeichnis> -l<lib> ...
Der Pfad zur Lib (-L) muss vor der Lib (-l) stehen.
Ralf
Nein leider -
Dann ist irgendwas an deinem Code fehlerhaft.
Ihr habt alle was übersehen :) libsndobj.a ist eine statische Bibliothek, ergo *muss* sie _nach_ dem Objekt angegeben werden, welches Funktionen aus ihr benötigt. Nur bei dynamischen ist es egal.
Ich gehe fast jede Wette ein, dass ein
g++ -L/usr/local/lib -o MyClass MyClass.cpp -lsndobj
funktioniert.
Philipp
Jeap ! Das wars. Sind das die Bibliotheken mit .a Endung. Wie dem auch sei. Ich bin überglücklich und hab das Tagesziel erreicht. Manchmal sind die Schritte eben klein aber wirkungsvoll. mit vielem Dank an Thomas Philipp und Michael Matz. Greetns TOM
thomas gorbach
Sind das die Bibliotheken mit .a Endung.
Ja, das .a steht für Archiv, da die statischen Bibliotheken ein Archiv von Objektdateien sind. Der Linker arbeitet alle Objekte und Bibliotheken in einem Durchgang ab. Dazu merkt er sich Symbole (Variable oder Funktionen), die von einem Objekt, egal ob direkt vorhanden oder aus einer Bibliothek, benötigt werden. Bei jedem weiteren Objekt schaut er nun, ob dieses das benötigte Symbol liefert und stellt die entsprechenden Verknüpfungen her. Aus diesem Grund müssen die Bibliotheken nach den Objekten folgen und auch die Bibliotheken müssen in der Reihenfolge der Abhängigkeiten angegeben werden. Wird dagegen ein Objekt gegen eine dynamische Bibliothek gelinkt, trägt der Linker den internen Namen der Bibliothek (der sog. soname) im entstehenden Executable ein und den Namen des benötigten Symbols in eine Tabelle im Executable. Für das Laden der entsprechenden Bibliothek und das Eintragen der Adresse des Symbols in der Tabelle ist hier der dynamische Linker ld-linux.so zuständig, welcher zur Laufzeit des Programms tätig wird. Aber wie Matze schon schrieb, sollte man es sich zur Gewohnheit machen, immer Bibliotheken nach den Objekten anzugeben, egal ob nun dynamisch oder statisch. Philipp -- Philipp Thomas Arbeit: pthomas@suse.de Entwicklung, SuSE Linux AG Privat: pth@t-link.de
Hi all, Am Freitag, 21. März 2003 11:40 schrieb thomas gorbach:
Ralf Corsepius wrote:
Am Fre, 2003-03-21 um 09.55 schrieb thomas gorbach:
Habe eine Frage zum einbinden einer Library. so hab ich es versucht: g++ -lsndobj -L/usr/local/lib MyClass.cpp -o MyClass
g++ -L<verzeichnis> -l<lib> ...
Der Pfad zur Lib (-L) muss vor der Lib (-l) stehen. Nein leider - auch das gibt die gleiche Fehlermeldung.
Ralf hat aber definitiv Recht :)
undefined reference to `SndWave::SndWave(char *, short, short, short, SndObj **, float, int, float)
Hmm, das sieht komisch aus! Diese Signatur gibt's nicht...
Konstruktor ist:
SndWave(char* name, short mode, short channels=1, short bits=16, SndObj** inputlist=0, float spos= 0.f, int vecsize=DEF_VECSIZE,... ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
int main(int argc, char* argv[]) { SndWave *input1; SndWave *output; input1 = new SndWave(argv[1],READ); //^^^^^^^^^^^^^^^^^^ Sieht anders aus ? return 1; } Bist Du Dir sicher, das Du den Kontruktor so aufrufen mußt? Ciao andre
Andre Heine wrote:
Hi all,
Am Freitag, 21. März 2003 11:40 schrieb thomas gorbach:
Ralf Corsepius wrote:
Am Fre, 2003-03-21 um 09.55 schrieb thomas gorbach:
Habe eine Frage zum einbinden einer Library. so hab ich es versucht: g++ -lsndobj -L/usr/local/lib MyClass.cpp -o MyClass
g++ -L<verzeichnis> -l<lib> ...
Der Pfad zur Lib (-L) muss vor der Lib (-l) stehen.
Nein leider - auch das gibt die gleiche Fehlermeldung.
Ralf hat aber definitiv Recht :)
undefined reference to `SndWave::SndWave(char *, short, short, short, SndObj **, float, int, float)
Hmm, das sieht komisch aus! Diese Signatur gibt's nicht...
Konstruktor ist:
SndWave(char* name, short mode, short channels=1, short bits=16, SndObj** inputlist=0, float spos= 0.f, int vecsize=DEF_VECSIZE,...
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
int main(int argc, char* argv[]) {
SndWave *input1; SndWave *output;
input1 = new SndWave(argv[1],READ); //^^^^^^^^^^^^^^^^^^ Sieht anders aus ?
return 1; }
Bist Du Dir sicher, das Du den Kontruktor so aufrufen mußt?
Ja bin schon sicher da der Autor der Klassen selbst in einer Beispieldatei es so macht. SndWave(char* name, short mode = OVERWRITE, short channels=1, short bits=16, SndObj** inputlist=0, float spos= 0.f, int vecsize = DEF_VECSIZE, float sr = DEF_SR) Ist auch logisch. Zuerst der Name des einzulesenden Soundfiles dann die Einstellung "Aufnahme". Alles andere ist initialisiert. Echt blöd ich komm nicht weiter damit da der Autor sich auch nicht meldet. :-( Die Bibliothek ist sonst eigentlich ziemlich übersichtlich. Wen's interessiert: http://www.may.ie/academic/music/musictec/SndObj/main.html mfg TOM
Hi, Am Freitag, 21. März 2003 19:01 schrieb thomas gorbach: [...]
input1 = new SndWave(argv[1],READ); //^^^^^^^^^^^^^^^^^^ Sieht anders aus ? Bist Du Dir sicher, das Du den Kontruktor so aufrufen mußt? Ja bin schon sicher da der Autor der Klassen selbst in einer Beispieldatei es so macht.
In der Beispiel Datei wird also "SndWave *obj = new SndWave(char *
name, READ);" aufgerufen?
Wie oder was ist READ? Ein #define?
Findet gcc auch die Header Datei
SndWave(char* name, short mode = OVERWRITE, short channels=1, short bits=16, SndObj** inputlist=0, float spos= 0.f, int vecsize =DEF_VECSIZE, float sr = DEF_SR)
Dieser Konstruktor hat für mich nichts mit Deinem Aufruf zu tun, hast Du mal die Versionen der Library verglichen? Wie gesagt, ich kenne READ nicht...
Ist auch logisch. Zuerst der Name des einzulesenden Soundfiles dann die Einstellung "Aufnahme". Alles andere ist initialisiert.
Das kann ich nicht beurteilen :)
Die Bibliothek ist sonst eigentlich ziemlich übersichtlich. Wen's interessiert:
Ja, habe ich mir angesehen, poste mal die betreffenden Zeilen des Header, insbesondere 'READ'! CIAo Andre
Hi, On Fri, 21 Mar 2003, Andre Heine wrote:
In der Beispiel Datei wird also "SndWave *obj = new SndWave(char * name, READ);" aufgerufen?
Wie oder was ist READ? Ein #define?
Findet gcc auch die Header Datei
? SndWave(char* name, short mode = OVERWRITE, short channels=1, short bits=16, SndObj** inputlist=0, float spos= 0.f, int vecsize =DEF_VECSIZE, float sr = DEF_SR)
Dieser Konstruktor hat f�r mich nichts mit Deinem Aufruf zu tun, hast Du mal die Versionen der Library verglichen?
Heah? Die default args sind dir aber schon aufgefallen, oder? Der obige Konstruktoraufruf waehlt in der Tat den angegebenen Konstruktor aus. Das READ ist mit Sicherheit in gleicher Weise ein #define wie OVERWRITE (oder ein enum). Wie auch immer, Thomas: da du nur eine statische Lib hast, musst du sie _hinter_ allen Objektfiles angeben, die Dinge aus ihr gebrauchen koennten. Dies schliesst in diesem Fall auch deine .cpp Files ein. Der Aufruf muss also zu erfolgen: g++ -o MyApp MyApp.cpp -L/path/to/lib -lsndblablabla Ciao, Micha.
Hi Michael, Am Freitag, 21. März 2003 20:20 schrieb Michael Matz:
Findet gcc auch die Header Datei
? SndWave(char* name, short mode = OVERWRITE, short channels=1, short bits=16, SndObj** inputlist=0, float spos= 0.f, int vecsize =DEF_VECSIZE, float sr = DEF_SR)
Dieser Konstruktor hat fr mich nichts mit Deinem Aufruf zu tun, hast Du mal die Versionen der Library verglichen?
Heah? Die default args sind dir aber schon aufgefallen, oder?
Nein ;((((( Ich habe nicht gewusst, das man so die restlichen Parameter weglassen darf. [...]
Wie auch immer, Thomas: da du nur eine statische Lib hast, musst du sie _hinter_ allen Objektfiles angeben, die Dinge aus ihr gebrauchen koennten. Dies schliesst in diesem Fall auch deine .cpp Files ein. Der Aufruf muss also zu erfolgen:
g++ -o MyApp MyApp.cpp -L/path/to/lib -lsndblablabla
Wiedermal etwas dazu gelernt :) Ciao Andre
participants (6)
-
Andre Heine
-
Michael Matz
-
Philipp Thomas
-
Ralf Corsepius
-
Stefan Sassenberg
-
thomas gorbach