Namespaces bei einer Library (Espeak)



  • http://www.c-plusplus.net/forum/p2403170
    Okay, hab jetzt hier einen neuen Thread eröffnet, da dieses Problem nur C++ betrifft. Ich hab jetzt also diese Espeak Library und ein kleines Programm, dass von sich sagt, es würde eine einfache Zeilenausgabe damit realisieren runtergeladen. Tuts natürlich nicht, war klar.
    Link: http://djkaos.wordpress.com/2009/12/27/simple-espeak-program-speak_lib/

    #include <string.h>
    #include <malloc.h>
    #include "speak_lib.h"
    
    espeak_POSITION_TYPE position_type;
    espeak_AUDIO_OUTPUT output;
    char *path=NULL;
    int Buflength = 500, Options=0;
    void* user_data;
    t_espeak_callback *SynthCallback;
    espeak_PARAMETER Parm;
    
    char Voice[] = {"default"};
    
    char text[20] = {"Hello World!"};
    unsigned int Size,position=0, end_position=0, flags=espeakCHARS_AUTO, *unique_identifier;
    
    int main(int argc, char* argv[] )
    {
        output = AUDIO_OUTPUT_PLAYBACK;
        int I, Run = 1, L;
        espeak_Initialize(output, Buflength, path, Options );
        espeak_SetVoiceByName(Voice);
        Size = strlen(text)+1;
        printf("Saying  '%s'",text);
        espeak_Synth( text, Size, position, position_type, end_position, flags,
        unique_identifier, user_data );
        espeak_Synchronize( );
        printf("\n:Done\n");
        return 0;
    }
    

    Erstens hab ich mal bei speak_lib.h die < > durch " " ersetzt, da es sich in dem gleichen Vereichnis befindet. Jetzt sagt mir der Compiler aber
    "undefined reference to", bei jeder der 4 Funktionen die im main aufgerufen werden. Ich vermute mal, dass dies daran liegt, dass der Compiler die namespaces nicht kennt, aber wie kann ich diese herausfinden?



  • "undefined reference to" ist normalerweise eine Linker-Fehlermeldung. D.h. er stört sich daran dass du Funktionen aufrufst, die nirgends definiert sind. => Du musst entweder den Code der Library (die .c/.cpp Files) oder die fertig compilierte Library (das .lib File) einbinden.

    ps: auf der von dir verlinkten Seite wird das mit den Switches -lportaudio -lespeak gemacht.
    (PortAudio ist zwar nicht *Teil* von eSpeak, wird aber vermutlich von eSpeak benötigt.)

    Falls du noch weitere Fragen zu dem Thema hast schreib bitte dazu mit welchem Compiler, welcher IDE (falls du eine verwendest) und auf welchem OS du entwickelst.



  • Der Linker findet die Funktionen nicht. Die Bibliothek(en) wirst du schon dazu binden müssen.

    Mit namespaces hat das genau so wenig zu tun wie dein Programm mit C++.



  • uncannysnake schrieb:

    Jetzt sagt mir der Compiler aber
    "undefined reference to", bei jeder der 4 Funktionen die im main aufgerufen werden.

    Das ist kein Compilerfehler, sondern ein Linkerfehler. Du dürftest den hier bekommen, weil du die Bibliotheken, die die Implementationen der jeweiligen Funktionen enthält, nicht mit angegeben hast. In deinem Link steht als Kommandozeile

    g++ -g -I. Speak.cpp -lportaudio -lespeak -o Speak
    

    Du siehst die -lXXX-Optionen? Hast du das bei dir?

    Ich vermute mal, dass dies daran liegt, dass der Compiler die namespaces nicht kennt, aber wie kann ich diese herausfinden?

    Erstens würdest du in diesem Fall einen (anderslautenden) Compilerfehler bekommen, und zweitens sieht diese Library stark nach C aus, mit anderen Worten sie benutzt keine Namespaces.



  • hustbaer schrieb:

    "undefined reference to" ist normalerweise eine Linker-Fehlermeldung. D.h. er stört sich daran dass du Funktionen aufrufst, die nirgends definiert sind. => Du musst entweder den Code der Library (die .c/.cpp Files) oder die fertig compilierte Library (das .lib File) einbinden.

    ps: auf der von dir verlinkten Seite wird das mit den Switches -lportaudio -lespeak gemacht.
    (PortAudio ist zwar nicht *Teil* von eSpeak, wird aber vermutlich von eSpeak benötigt.)

    Falls du noch weitere Fragen zu dem Thema hast schreib bitte dazu mit welchem Compiler, welcher IDE (falls du eine verwendest) und auf welchem OS du entwickelst.

    Ich weiß nicht recht, was die Befehle -lportaudio -lespeak -o bedeuten, wie kann ich diese Funktionen verwenden, dass ich dieses Programm als Basis für mein eigentliches Projekt verwenden kann?

    Windows NT(7), GCC, welcher nach C++11 geht und CodeBlocks

    PS: Okay, ich denke ich weiß nun was gemeint ist, habe auch portaudio.h und espeak.cpp in dem ordner gefunden. aber wie übergebe ich die dem compiler über codeblocks?



  • -lXXX bedeutet "link die Library XXX dazu".
    -o Filename bedeutet "speicher das fertige Programm als Filename ab".

    Da du allerdings CodeBlocks als IDE verwendest, würde ich es auch direkt in CodeBlocks einstellen. Wie das geht kannst du dir ergoogeln (z.B. mit codeblocks additional libraries).



  • Habe portaudio und espeak hinzugefügt,
    die Folge:

    ld.exe||cannot find -lportaudio|
    ld.exe||cannot find -lespeak|
    ||=== Build failed: 2 error(s), 0 warning(s) (0 minute(s), 2 second(s)) ===|
    

    Die Files sind doch im selben Ordner?



  • -lXXX sucht im Library-Suchpfad, also /usr/lib etc. Wenn der Kram im selben Ordner liegt, musst du noch . als Suchpfad hinzufügen. Die Option wäre -L.
    Wie man das in Codeblocks einstellt, weiß ich nicht.



  • Okay, jetzt wird es kryptisch.
    Ich bin dem Tut auf http://stackoverflow.com/questions/5862757/how-do-i-link-to-a-library-with-codeblocks gefolgt, hab die Dateien ausgewählt (libnames sind jetzt also Pfad\espeak.cpp und Pfad\portaudio.h, da er Pfad\espeak und Pfad\portaudio auch nicht gefunden hat und jetzt sagt er auf einmal 30 Errors, inklusive einmal mutiple definition of main und ca 4fache undefined reference to jeder der 4 Funktionen

    Edit: Ach ja, ein paar andere sind auch dazu gekommen, ich vermute mal die stehen in espeak.cpp oder portaudio.h, eher zweites, da sie namen wie espeak_Synth haben


  • Mod

    espeak.cpp ... portaudio.h

    Du musst die Bibliotheken zuerst übersetzen oder sonstwie auf deinem System installieren. Wie das geht, hängt von deinem System ab. Für Ubuntu (möglicherweise auch allgemein Debian) gibt es beispielsweise fertige Pakete im normalen Paketmanager, so dass du dir den ganzen Kram sparen kannst. Für Windows gibt es einen fertigen Installer. Für andere übliche Systeme gibt es bestimmt auch einfache Möglichkeiten.

    Wenn du wirklich ein exotisches System hast, bei dem du die Bibliotheken selber übersetzen und installieren musst, dann hätte ich eigentlich erwartet, dass du so etwas auch selber kannst - schließlich brauchst du das dann andauernd. Falls dies dein erste Kontakt mit einem solchen System ist: Wenn du Glück hast, ist es mit einem üblichen configure, make, make install getan (wenn du das nie gehört hast: Google: configure make make install). Wenn nicht, dann liegt hoffentlich eine entsprechende Anleitung dabei, der du folgst. Wenn nicht, hast du ein Problem 🙂 .

    Wie du Bibliotheken installierst und nutzt hat aber nichts mehr mit C++ zu tun, dass ist eine Frage, wie du deinen Computer (genauer: Dein Betriebssystem) richtig nutzt. Die Antwort kann, wie obiger Absatz schon andeutet, irgendetwas zwischen "Anklicken, Fertig" und einer langen Folge von komplizierten Anweisungen sein. Zur Not (d.h. wenn deine Bibliotheken nicht zur einfachen Sorte gehören), solltest du dich vielleicht erst an einigen einfachen Beispielen üben. Was dafür geeignet ist, das können wir dir sagen, wenn du uns dein System verrätst.

    P.S.: Der Defaultinstallationspfad unter Ubuntu hat übrigens noch ein espeak drin, das muss dort also (wenn du libespeak-dev installierst hast) also #include "espeak/speak_lib.h" heißen (oder Pfad entsprechend setzen, beim GCC mit -I). Das Programm funktioniert. "Hello" wird grauenhaft betont, ansonsten klingt das sogar ganz ok.



  • Windows NT(7), GCC, welcher nach C++11 geht und CodeBlocks

    Vorher schon erwähnt, danke


Log in to reply