Problem GNU libmatheval in c++

Du bist neu in der Welt von C++? Dann schau hier herein!
Antworten
sewa
Beiträge: 9
Registriert: 18. März 2011 15:38

Problem GNU libmatheval in c++

Beitrag von sewa »

Hallo!

für ein Funktionsparser habe ich im Internet nach einer Bibliothek gesucht, die der eingegebenen mathematischen Funktionen für spezifizierte variable Werte auswerten kann und ich bin auf GNU Libmatheval gestoßen. ihre Funktionen könnte ich für mein Programm in C ohne Probleme verwenden ; und jetzt versuche ich seit 3 tage das Programm in C++ umzuschreiben damit ich die Funktionswerte mit Qt plotten kann hier ist das code :

Code: Alles auswählen

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cassert>
#include <matheval.h>

#define BUFFER_SIZE 256
#define MAX 20
#define pi 3.1415

using namespace std;

int main( int argc, char *argv[])
{
  char buffer[BUFFER_SIZE];
  int length;
  void *f;
  char **names;
  int count;
  double x[MAX];
  int j;
  cout <<"f(x_f) = ";
  cin.getline(buffer, BUFFER_SIZE);
  length = strlen (buffer);
  if (length > 0 && buffer[length - 1] == '\n')
    buffer[length - 1] = '\0';

  f = evaluator_create (buffer);
    assert (f);
  evaluator_get_variables (f,&names, &count);
  cout <<" " ;
  for (j = 0; j < count; j++)
  // printf ("%s ", names[j]);
  cout <<'\n';

  for(j=0;j<=MAX-1;j++){
    x[j]=(pi/MAX)*j;
    x[j]=evaluator_evaluate_x (f, x[j]);
    cout << x[j];
  }
evaluator_destroy (f);
exit (EXIT_SUCCESS);
}
der Compiler meldet mir díe folgenden Fehler:

Code: Alles auswählen

evaluator.cpp:(.text+0xa9): undefined reference to `evaluator_create'
evaluator.cpp:(.text+0x103): undefined reference to `evaluator_get_variables'
evaluator.cpp:(.text+0x1a1): undefined reference to `evaluator_evaluate_x'
evaluator.cpp:(.text+0x1e6): undefined reference to `evaluator_destroy'
collect2: ld returned 1 exit status
hat jemand da eine Idee oder kennt Ihr einer andere Library die so ähnliches unter C++ kann .

Danke Schonmal im Voraus

Gruß
sewa


// edit franzf: code-tags eingefügt. Bitte in Zukunft selber machen, Danke :)
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Linkst du denn auch korrekt gegen die lib? Steht im Header "matheval.h" schon sowas wie

Code: Alles auswählen

#ifdef __cplusplus
extern "C"
Die ganzen evaluator_*-Funktionen stammen schon aus der libmatheval, oder?
sewa
Beiträge: 9
Registriert: 18. März 2011 15:38

Beitrag von sewa »

ja die evaluator-Funktionen stammen aus Libmatheval
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

sewa hat geschrieben:ja die evaluator-Funktionen stammen aus Libmatheval
Kannst du auch noch was zu den beiden anderen Fragen sagen? (Linken, extern "C")
sewa
Beiträge: 9
Registriert: 18. März 2011 15:38

Beitrag von sewa »

ich bin neulinger in c++ dadrauf habe ich nicht geachtet.
Sie haben vollkommen recht; es muss ein Linkerfehler sein . ich muss anschauen wie ich es richtig linken kann
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Ich bin mir mittlerweile ziemlich sicher, dass es am fehlenden extern "C" liegt.
Einfach mal in der main.cpp das

Code: Alles auswählen

#include <matheval.h>
durch ein

Code: Alles auswählen

extern "C" {
  #include <matheval.h>
}
ersetzen, wahrscheinlich geht das dann gleich.
sewa
Beiträge: 9
Registriert: 18. März 2011 15:38

Beitrag von sewa »

habe ich probiert aber leider der meldet immer noch die gleichen Fehler
sewa
Beiträge: 9
Registriert: 18. März 2011 15:38

Beitrag von sewa »

ich habe es zu dem Code zugefügt aber es funktioniert immer noch nicht :

Code: Alles auswählen

include <cassert>

extern "C" {
#include <matheval.h>
}

#define BUFFER_SIZE 256
#define MAX 20
#define pi 3.1415

using namespace std;

extern "C" { 
    void *evaluator_create (char *string);
    void evaluator_destroy (void *evaluator);
    void evaluator_get_variables (void *evaluator, char ***names, int *count);
    double evaluator_evaluate_x (void *evaluator, double x);

}

int main( int argc, char *argv[])
{

franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Ein "#include" fügt die Datei komplett ein. Die Deklarationen im zweiten "extern C" brauchts also absolut nicht.
Wenn es noch immer nicht geht, liegt es daran wie du linkst.
Verwendest du Makefiles? Wie erstellst du diese? Wie verwendest du libmatheval (systemwei installiert, mit dem Projekt ausgeliefert, die files direkt ins executable gelinkt)?

Am besten postet du alle relevanten, eigenen Dateien. Sonst kann man nur raten.
Antworten