Probleme mit ctime.h



  • Hallo liebes Forum,

    bei der Arbeit mit Eclipse stoße ich immer wieder an das ein oder andere Problem.
    Ich arbeite gerade an einer Sprachsteuerung und möchte mit meinem Code die Komponente Sprachsteuerung und eine Maschine verbinden.

    Um einen Datenstream auszulesen und Daten in Variablen abzulegen, möchte ich gerne zur Detektion die regex-Funktionalitäten benutzen.

    Ich arbeite mit Linux Mint.

    Kompiliere ich meinen Quellcode über die (Linux-)Kommandozeile ist das alles kein Problem und es gibt keine Fehler. Mache ich das gleiche mit Eclipse werden mir einige Fehler in Kombination mit <ctime> ausgegeben.

    Hier ein Auszug aus der Eclipse-Konsole:


    make all
    Building file: ../src/robfunction.cpp
    Invoking: GCC C++ Compiler
    g++ -I/usr/local/include/pocketsphinx -I/usr/include -I/usr/local/include/sphinxbase -I/usr/local/include/sphinxtrain -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"src/robfunction.d" -MT"src/robfunction.o" -o "src/robfunction.o" "../src/robfunction.cpp"
    In file included from /usr/include/c++/7/bits/locale_facets_nonio.h:39:0,
    from /usr/include/c++/7/locale:41,
    from /usr/include/c++/7/regex:44,
    from ../src/robfunction.cpp:18:
    /usr/include/c++/7/ctime:64:11: error: ‘::clock’ has not been declared
    using ::clock;
    ^~~~~
    /usr/include/c++/7/ctime:65:11: error: ‘::difftime’ has not been declared
    using ::difftime;
    ^~~~~~~~
    /usr/include/c++/7/ctime:66:11: error: ‘::mktime’ has not been declared
    using ::mktime;
    ^~~~~~
    /usr/include/c++/7/ctime:67:11: error: ‘::time’ has not been declared
    using ::time;
    ^~~~
    /usr/include/c++/7/ctime:68:11: error: ‘::asctime’ has not been declared
    using ::asctime;
    ^~~~~~~
    /usr/include/c++/7/ctime:69:11: error: ‘::ctime’ has not been declared
    using ::ctime;
    ^~~~~
    /usr/include/c++/7/ctime:70:11: error: ‘::gmtime’ has not been declared
    using ::gmtime;
    ^~~~~~
    /usr/include/c++/7/ctime:71:11: error: ‘::localtime’ has not been declared
    using ::localtime;
    ^~~~~~~~~
    /usr/include/c++/7/ctime:72:11: error: ‘::strftime’ has not been declared
    using ::strftime;
    ^~~~~~~~
    src/subdir.mk:24: recipe for target 'src/robfunction.o' failed
    make: *** [src/robfunction.o] Error 1
    "make all" terminated with exit code 2. Build might be incomplete.

    10:16:45 Build Failed. 11 errors, 0 warnings. (took 911ms)


    Habt ihr eine Idee wie ich dieses Problem lösen kann?

    Vielen Dank



  • Ich würde erst mal -std=c++11 zu den Compilerflags hinzufügen.


  • Mod

    Schaut allgemein erst einmal so aus, als wären da zwei inkompatible Implementierungen der Standardbibliothek vermischt. Diese /usr/include/c++/7/ctime verlässt sich auf gewisse Eigenschaften einer anderen Datei (wahrscheinlich time.h), die es importiert, aber anscheinend wird eine time.h von anderswo her importiert, die diese Eigenschaften nicht erfüllt.

    Das wird wahrscheinlich an den Includepfaden liegen. Nun sind in der Kommandozeile ja schon einige Includepfade explizit gesetzt, aber es können auch noch (hier nicht sichtbar) weitere Pfade über Umgebungsvariablen gesetzt sein. Du sagst, du kannst es über die Kommandozeile compilieren. Welchen Befehl hast du dafür benutzt? Was passiert, wenn du genau den Ausdruck benutzt, den dein Makefile erzeugt? Also

    g++ -I/usr/local/include/pocketsphinx -I/usr/include -I/usr/local/include/sphinxbase -I/usr/local/include/sphinxtrain -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"src/robfunction.d" -MT"src/robfunction.o" -o "src/robfunction.o" "../src/robfunction.cpp"
    

    ?



  • Hallo,

    erst einmal vielen Dank für eure Nachrichten.

    Bisher habe ich das ganze Projekt rein über die Kommandozeile mit dem folgenden Kommando kompiliert:

    g++ -o hello_ps_erw psTest_erw1.cpp speech_reco_fun.cpp robfunction.cpp -DMODELDIR="pkg-config --variable=modeldir pocketsphinx" pkg-config --cflags --libs pocketsphinx sphinxbase

    Dies hat auch immer ohne Probleme funktioniert.

    Für mich ist aber klar, dass ich diesen Weg zukünftig nicht gehen möchte und es nur sinnig ist, eine IDE zu verwenden wie Eclipse.
    Da sich hier ganz neue Möglichkeiten bezüglich des debuggen usw. ergeben.

    Wenn ich den Ausdruck der Makefile verwende (g++ -I/usr/local/include/pocketsphinx -I/usr/include -I/usr/local/include/sphinxbase -I/usr/local/include/sphinxtrain -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"src/robfunction.d" -MT"src/robfunction.o" -o "src/robfunction.o" "../src/robfunction.cpp"), dann werden mir die gleichen Fehler angezeigt, wie auch in Eclipse.


  • Mod

    • Was ergibt pkg-config --cflags --libs pocketsphinx sphinxbase bei dir?
    • Was passiert, wenn du -Wp,-v (Achtung, da ist kein Leerzeichen drin und das Komma muss auch da sein!) zu den beiden Compileraufrufen hinzufügst? Beziehungsweise: Was passiert, weiß ich schon. Dein Compiler wird seine Includepfade anzeigen. Was ich eigentlich wissen möchte, ist, was die jeweils sind und ob sie sich unterscheiden.


  • Diese Befehle werden für den Spracherkenner benötigt. Pocketsphinx als Schnittstelle und Sphinxbase als Backend.

    Für den ersten Fall erhalte ich folgende Ausgabe:

    g++ -o hello_ps_erw psTest_erw1.cpp speech_reco_fun.cpp robfunction.cpp   -DMODELDIR=\"`pkg-config --variable=modeldir pocketsphinx`\"     `pkg-config --cflags --libs pocketsphinx sphinxbase` -Wp,-v
    
    ignoring duplicate directory "/usr/include/x86_64-linux-gnu/c++/7"
    ignoring nonexistent directory "/usr/local/include/x86_64-linux-gnu"
    ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/7/../../../../x86_64-linux-gnu/include"
    ignoring duplicate directory "/usr/local/include"
      as it is a non-system directory that duplicates a system directory
    ignoring duplicate directory "/usr/local/include"
      as it is a non-system directory that duplicates a system directory
    ignoring duplicate directory "/usr/local/include/sphinxbase"
    #include "..." search starts here:
    #include <...> search starts here:
     /usr/local/include/sphinxbase
     /usr/local/include/pocketsphinx
     /usr/include/c++/7
     /usr/include/x86_64-linux-gnu/c++/7
     /usr/include/c++/7/backward
     /usr/lib/gcc/x86_64-linux-gnu/7/include
     /usr/local/include
     /usr/lib/gcc/x86_64-linux-gnu/7/include-fixed
     /usr/include/x86_64-linux-gnu
     /usr/include
    End of search list.
    ignoring duplicate directory "/usr/include/x86_64-linux-gnu/c++/7"
    ignoring nonexistent directory "/usr/local/include/x86_64-linux-gnu"
    ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/7/../../../../x86_64-linux-gnu/include"
    ignoring duplicate directory "/usr/local/include"
      as it is a non-system directory that duplicates a system directory
    ignoring duplicate directory "/usr/local/include"
      as it is a non-system directory that duplicates a system directory
    ignoring duplicate directory "/usr/local/include/sphinxbase"
    #include "..." search starts here:
    #include <...> search starts here:
     /usr/local/include/sphinxbase
     /usr/local/include/pocketsphinx
     /usr/include/c++/7
     /usr/include/x86_64-linux-gnu/c++/7
     /usr/include/c++/7/backward
     /usr/lib/gcc/x86_64-linux-gnu/7/include
     /usr/local/include
     /usr/lib/gcc/x86_64-linux-gnu/7/include-fixed
     /usr/include/x86_64-linux-gnu
     /usr/include
    End of search list.
    ignoring duplicate directory "/usr/include/x86_64-linux-gnu/c++/7"
    ignoring nonexistent directory "/usr/local/include/x86_64-linux-gnu"
    ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/7/../../../../x86_64-linux-gnu/include"
    ignoring duplicate directory "/usr/local/include"
      as it is a non-system directory that duplicates a system directory
    ignoring duplicate directory "/usr/local/include"
      as it is a non-system directory that duplicates a system directory
    ignoring duplicate directory "/usr/local/include/sphinxbase"
    #include "..." search starts here:
    #include <...> search starts here:
     /usr/local/include/sphinxbase
     /usr/local/include/pocketsphinx
     /usr/include/c++/7
     /usr/include/x86_64-linux-gnu/c++/7
     /usr/include/c++/7/backward
     /usr/lib/gcc/x86_64-linux-gnu/7/include
     /usr/local/include
     /usr/lib/gcc/x86_64-linux-gnu/7/include-fixed
     /usr/include/x86_64-linux-gnu
     /usr/include
    End of search list.
    
    

    Für den zweiten Fall erhalte ich:

    g++ -I/usr/local/include/pocketsphinx -I/usr/include -I/usr/local/include/sphinxbase -I/usr/local/include/sphinxtrain -O0 -g3 -Wall -c -fmessage-length=0 -Wp,-v -MMD -MP -MF "src/robfunction.d" -MT"src/robfunction.o" -o "src/robfunction.o" "../src/robfunction.cpp" 
    
    ignoring duplicate directory "/usr/include/x86_64-linux-gnu/c++/7"
    ignoring nonexistent directory "/usr/local/include/x86_64-linux-gnu"
    ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/7/../../../../x86_64-linux-gnu/include"
    ignoring duplicate directory "/usr/include"
      as it is a non-system directory that duplicates a system directory
    #include "..." search starts here:
    #include <...> search starts here:
     /usr/local/include/pocketsphinx
     /usr/local/include/sphinxbase
     /usr/local/include/sphinxtrain
     /usr/include/c++/7
     /usr/include/x86_64-linux-gnu/c++/7
     /usr/include/c++/7/backward
     /usr/lib/gcc/x86_64-linux-gnu/7/include
     /usr/local/include
     /usr/lib/gcc/x86_64-linux-gnu/7/include-fixed
     /usr/include/x86_64-linux-gnu
     /usr/include
    End of search list.
    

    Wobei hier auch wieder die Fehlermeldungen im Anschluss kommen.



  • Könnte es an der unterschiedlichen Reihenfolge (bzw. dem Hinzufügen von sphinxtrain) liegen?

    /usr/local/include/sphinxbase
    /usr/local/include/pocketsphinx
    

    vs.

    /usr/local/include/pocketsphinx
    /usr/local/include/sphinxbase
    /usr/local/include/sphinxtrain
    

    PS: Die ignoring duplicate/nonexistent directory Warnungen solltest du dir auch mal genauer anschauen.


  • Mod

    Ja, der nächste Schritt wäre meines Erachtens nach, ein Ändern der Reihenfolge der Includes des nicht-funktionierenden Kommandos. Und das sphinxtrain ganz weglassen.

    Wenn's dann noch nicht funktioniert, müssen wir mal noch die anderen Flags durchgehen und forschen, wo die überhaupt herkommen.

    Kannst du noch einmal posten, was pkg-config --cflags --libs pocketsphinx sphinxbase auf der Kommandozeile ergibt? Also ohne Compileraufruf, einfach nur direkt dieser Befehl.



  • In Eclipse habe ich jetzt das Include für sphinxtrain aus den Einstellungen komplett entfernt. Das Builden hat dann soweit auch funktioniert. Allerdings gab es dann Probleme beim Linken. Hier fehlen dann wichtige Funktionen aus der Headerdatei pocketsphinx.h

    Wenn ich nur die Zeile

    pkg-config --cflags --libs pocketsphinx sphinxbase
    

    Über die Kommandozeile ausführe bekomme ich diese Antwort:

    -I/usr/local/include -I/usr/local/include/sphinxbase -I/usr/local/include/pocketsphinx -I/usr/local/include -I/usr/local/include/sphinxbase -L/usr/local/lib -lpocketsphinx -lsphinxbase -lsphinxad -lpulse -lpulse-simple -lpthread -lm
    
    

  • Mod

    Letztlich sind das offenbar die korrekten Kommandozeilenparameter.

    Möglichkeit 1: Du bringst dem Makefile in Eclipse bei, die pkg-config zu benutzen. Genauso wie es dein manuelles Kommando macht. Da gibt es sicher auch irgendetwas in der configure-make Kette, dass das vereinfacht, denn das ist ein Standardprozess. Ich weiß aber nicht, ob Eclipse da direkte Unterstützung für hat, denn ich kenne mich mit Eclipse nicht so aus.
    Möglichkeit 2: "wichtige Funktionen aus der Headerdatei pocketsphinx.h" sagst du? Das heißt, im Eclipsekommando bist du jetzt wohl einen Schritt weiter, aber nun werden die libs nicht mehr gelinkt. Vermutlich, weil du sie aus den Einstellungen entfernt hast. Du musst irgendwie dafür sorgen, dass dem Linkerkommando -lpocketsphinx -lsphinxbase -lsphinxad -lpulse -lpulse-simple -lpthread -lm mit übergeben wird, so wie es derzeit auf deiner manuellen Kommandozeile erfolgt. Eclipse hat da gewiss etwas für da.



  • Dann schon einmal vielen Dank für die Hilfen.
    Komm leider heute erst wieder dazu hier weiter zu machen.

    Ich teste die beiden Möglichkeiten heute und melde mich wieder.



  • Hurra, wieder ein kleiner Erfolg.

    Dank eurer Hilfe kann ich nun Programme Builden und Ausführen.

    Jetzt ist nur noch ein kleiner Fehler im Programm drinnen, der das Programm beim Ausführen beendet.

    Aber das ist denke ich auch lösbar.

    Vielen vielen Dank für eure Hilfestellungen und eure guten Tipps.


Log in to reply