Forum: PC-Programmierung Bibliothek in QT Creator verwenden?


von Benjamin (Gast)


Lesenswert?

Hallo,

ich möchte für ein Programm das ich mit QT Creator in C++ schreibe 
libsndfile (http://www.mega-nerd.com/libsndfile/) verwenden.

Dazu habe ich ein einfaches "Qt-Gui-Anwendung"-Projekt erstellt und über 
"Bibliothek hinzufügen" die .lib welche sich im Projektordner befindet 
hinzugefügt.

Zum testen möchte ich einfach beim anklicken eines Buttons eine 
wav-Datei öffnen:
1
#include "mainwindow.h"
2
#include "ui_mainwindow.h"
3
#include <sndfile.h>
4
5
MainWindow::MainWindow(QWidget *parent) :
6
    QMainWindow(parent),
7
    ui(new Ui::MainWindow)
8
{
9
    ui->setupUi(this);
10
}
11
12
MainWindow::~MainWindow()
13
{
14
    delete ui;
15
}
16
17
void MainWindow::ButtonHandler()
18
{
19
    //create filepointer
20
    SNDFILE*    pst_SourceFile;
21
    SF_INFO*    pst_SourceInfo;
22
23
    //open File
24
    pst_SourceFile = sf_open( "Z:\\Audio_Projekte\\testfiles\\file1.wav" , SFM_READ, pst_SourceInfo) ;
25
26
}

beim übersetzen kommt aber die Fehlermeldung:
1
Fehler:undefined reference to `sf_open'

Jemand eine Idee woran das liegen könnte oder was ich noch machen muss 
um die Bibliothek zu verwenden?


In der Projektdatei wurde übrigens folgender code erstellt durch das 
hinzufügen der Bibliothek:
1
unix:!macx:!symbian|win32: LIBS += -L$$PWD/libsndfile/lib/ -llibsndfile-1
2
3
INCLUDEPATH += $$PWD/libsndfile/include
4
DEPENDPATH += $$PWD/libsndfile/include
5
6
win32: PRE_TARGETDEPS += $$PWD/libsndfile/lib/libsndfile-1.lib
7
else:unix:!macx:!symbian: PRE_TARGETDEPS += $$PWD/libsndfile/lib/liblibsndfile-1.a
8
9
OTHER_FILES += \
10
    libsndfile/lib/libsndfile-1.lib

von Klaus W. (mfgkw)


Lesenswert?

hm, ich würde mal mit dumpbin oder so etwas nachsehen, wie einerseits 
die externe Referenz in dem aus deinem Programm erzeugten OBJ genau 
heißt, und andererseits wie das Symbol in der lib genau heißt.

Je nach Compilereinstellungen und ob extern "C" oder nicht heißen die 
Symbole jeweils anders; sf_open wird aber auf jeden Fall im Namen 
vorkommen.

Zum erfolgreichen Linken müssen sie aber natürlich exakt übereinstimmen.

von Rolf M. (rmagnus)


Lesenswert?

Benjamin schrieb:
> unix:!macx:!symbian|win32: LIBS += -L$$PWD/libsndfile/lib/ -llibsndfile-1

Also zumindest unter Unix-artigen Plattformen müßte es -lsndfile-1 
heißen.

von Benjamin (Gast)


Angehängte Dateien:

Lesenswert?

@Klaus Wachtler:
So richtig kann ich dir nicht folgen, sry.

Habe bis jetzt fast ausschließlich uC Programmiert und kenne mich mit 
IDEs für PC-Software noch nicht wirklich aus.

Ich habe im Anhang mal das gesamte Projektverzeichnis gezippt und 
angehangen.

@Rolf Magnus:
Ich verwende gerade Win7, könnte es aber später auch mal auf meinem 
Laptop mit Ubuntu testen.

von Vlad T. (vlad_tepesch)


Lesenswert?

Benjamin schrieb:
> @Klaus Wachtler:
> So richtig kann ich dir nicht folgen, sry.

laut der Webseite ist das ganze ein e C-Library.

Jetzt schau bitte in den inkludierten header, ob da sowas wie
1
#ifdef __cplusplus
2
extern "C" {
3
#endif
4
5
... prototypen
6
7
8
#ifdef __cplusplus
9
}
10
#endif
steht.
wenn nicht, dann schreibst du das mal um den include befehl drum rum

edit:
die ifdefs kannst du dann natürlich weglassen, da feststeht, dass es c++ 
ist.

von Benjamin (Gast)


Lesenswert?

Ja, die Zeilen mit extern "C" stehen in dem Header.

von Εrnst B. (ernst)


Lesenswert?

Benjamin schrieb:
> else:unix:!macx:!symbian: PRE_TARGETDEPS += 
$$PWD/libsndfile/lib/liblibsndfile-1.a
...
trag mal beim Bibliothek-Hinzufügen statt "libsndfile" nur "sndfile" 
ein.
dann sollten sich diese "lib"-Verdoppelungen auflösen.

von Benjamin (Gast)


Lesenswert?

ändert leider auch nix.

im libsndfile\bin Ordner befindet sich noch eine .dll, muss man die 
vielleicht noch unterbringen ?

von Εrnst B. (ernst)


Lesenswert?

Benjamin schrieb:
> im libsndfile\bin Ordner befindet sich noch eine .dll, muss man die
> vielleicht noch unterbringen ?

das sollte durch das ".lib"-File libsndfile/lib/libsndfile-1.lib 
erledigt werden.

Passt deine lib/dll denn zur QT? Selber Compiler, 32/64 Bit usw.?

Spricht was gegen
#include <QtMultimedia>
bzw warum brauchst du sndfile statt der QT-eigenen Audiofile-Handler?

von Benjamin (Gast)


Lesenswert?

> Spricht was gegen
> #include <QtMultimedia>
> bzw warum brauchst du sndfile statt der QT-eigenen Audiofile-Handler?

So wie ich das in der Doku von QtMultimedia sehe sind das eher 
Funktionen zur Aufnahme von Sound von einem "input device" also 
Soundkarte/Mikrofon und zur Ausgabe an ein "output device" also 
Soundkarte/Lautsprecher usw.
Das man damit Dateien öffnen kann geht aus der Doku nicht wirklich 
hervor.

Habe auf qt.nokia.com im Bereich "Doc" auch keine anderen APIs finden 
können mit denen man .wav oder andere Audiodateien öffnen kann.

> Passt deine lib/dll denn zur QT? Selber Compiler, 32/64 Bit usw.?
Gute Frage..

auf der Seite von libsndfile gibt es ja 2 Installer für Windows.

Ich habe vorher den "Win64 installer" genommen.
Nun habe ich mal den "Win32 installer" in einem anderen Ordner 
installiert auf auf den verlinkt, und siehe da, es kommt keine 
Fehlermeldung beim compilieren, stattdessen stützt das Programm aber 
direkt nach dem Starten ab.
-.-
1
Starte Z:\Audio_Projekte\Projekte\Test2\Test2-build-desktop-Qt_4_7_4_for_Desktop_-_MinGW_4_4__Qt_SDK__Debug\debug\Test2.exe...Das Programm ist abgestürzt.
2
Z:\Audio_Projekte\Projekte\Test2\Test2-build-desktop-Qt_4_7_4_for_Desktop_-_MinGW_4_4__Qt_SDK__Debug\debug\Test2.exe beendet, Rückgabewert -1073741515

von Rolf Magnus (Gast)


Lesenswert?

Benjamin schrieb:
> Habe auf qt.nokia.com im Bereich "Doc" auch keine anderen APIs finden
> können mit denen man .wav oder andere Audiodateien öffnen kann.

http://developer.qt.nokia.com/doc/qt-4.8/qsound.html

Und dann gibt's da noch phonon, für dessen Programmierung man aber auch 
zusätzliche Libs braucht:

http://developer.qt.nokia.com/doc/qt-4.8/phonon-overview.html

von Benjamin (Gast)


Lesenswert?

Rolf Magnus schrieb:
> Benjamin schrieb:
>> Habe auf qt.nokia.com im Bereich "Doc" auch keine anderen APIs finden
>> können mit denen man .wav oder andere Audiodateien öffnen kann.
>
> http://developer.qt.nokia.com/doc/qt-4.8/qsound.html

Damit kann ich einen Sound abspielen, einmal oder mehrere mal 
hintereinander. Funktioniert auch, aber nützt mir nichts.

Ich möchte die einzelne Samples haben, (-> FFT -> verarbeiten -> iFFT 
->) und dann wieder als wav abspeichern.

von ich (Gast)


Lesenswert?

Benjamin schrieb:
> Ich habe vorher den "Win64 installer" genommen.
> Nun habe ich mal den "Win32 installer" in einem anderen Ordner
> installiert auf auf den verlinkt, und siehe da, es kommt keine
> Fehlermeldung beim compilieren, stattdessen stützt das Programm aber
> direkt nach dem Starten ab.

Du musst die "libsndfile-1.dll" entweder in das Verzeichnis deiner .exe 
oder nach windows/system32 kopieren.

von Εrnst B. (ernst)


Lesenswert?

Benjamin schrieb:
> Fehlermeldung beim compilieren, stattdessen stützt das Programm aber
> direkt nach dem Starten ab.

Also ohne Button-Press, ohne dass sdnfile-Funktionen aufgerufen wurden?

Meine Vermutung:
die Binärdistribution von sndfile wurde mit dem Microsoft-VC-Compiler 
übersetzt, deine Qt verwendet MinGW (also GCC).

sollte bei "extern "C"" zwar irgendwie zusammenspielen, aber...

Versuch mal für beides denselben Compiler zu verwenden.
(Also entweder QT für VC installieren, oder libsndfile mit dem 
QT-Creator-Eigenen MinGW übersetzen)

von Benjamin (Gast)


Lesenswert?

ich schrieb:
> Du musst die "libsndfile-1.dll" entweder in das Verzeichnis deiner .exe
> oder nach windows/system32 kopieren.

das scheint das Problem gewesen zu sein, jetzt startet es.

Ich muss zwar erst noch weitere API-Funktonen aufrufen um sicher zu 
gehen das es läuft aber sieht ganz gut aus.

Der Vollständigkeit halber:
Εrnst B✶ schrieb:
> Benjamin schrieb:
>> Fehlermeldung beim compilieren, stattdessen stützt das Programm aber
>> direkt nach dem Starten ab.
>
> Also ohne Button-Press, ohne dass sdnfile-Funktionen aufgerufen wurden?
Ja, ich bekam erst gar keine GUI zu sehen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.