WCM Forum

WCM Forum (http://www.wcm.at/forum/index.php)
-   Programmierung (http://www.wcm.at/forum/forumdisplay.php?f=17)
-   -   Bibliotheksfunktion aufrufen (http://www.wcm.at/forum/showthread.php?t=202340)

Take_Five 28.10.2006 23:43

Bibliotheksfunktion aufrufen
 
Hi. Ich programmiere in C++ und möchte eine Funktion aus einer eigenen Headerdatei aufrufen und zwar wie folgt:

Ich hab eine lmmin.c, lm_eval.h
Datei mit gcc -c lmmin.c -o lmmin.o
kompiliert (in lmmin.c steht #include "lm_eval.h")

Jetzt möcht ich in C++ eine Funktion aus lmmin.c aufrufen.

Mein Problem ist, dass ich das Ganze in C schon gelöst hab, wenn ich jedoch die Funktion aus lmmin.c aus einer Methode meiner Klasse aufrufe, dann gibts:

undefined reference to ...

Ich hoffe, ich hab das Problem so einigermaßen beschreiben können

Lg Stefan

Biri 29.10.2006 10:49

hi,

du musst entwedr die .h Datei in deiner .cpp includen oder die aufgerufene Funktion als external deklarieren.

fg
hannes

Take_Five 29.10.2006 22:24

Ich hab die .h Datei bereits inkludiert.

Das Komische ist, dass ich in meinem C Programm das Ganze schon zum Laufen gebracht habe. Wenn ich jedoch die Bibliotheksfunktion in meiner Klasse aufrufe (möcht das C Programm einfach auf C++ portieren), dann funktionierts nicht.

Muss ich eigene Bibliotheksfunktionen in Klassen anders aufrufen?

delphirocks 30.10.2006 06:56

Das Einzige, was mir einfällt:

gcc compiliert nur C, während g++ für C++ zuständig ist (zumindest bin ich bis jetzt immer davon ausgegangen).

Ein Unterschied ist z.B. das "name mangling" des C++ Compilers, das verwendet wird, um überladene Funktionen eindeutig zu kennzeichen.

Deswegen wird er deine Funktion wahrscheinlich auch nicht finden.

Wenn du die Funktionen als C Funktionen exportieren willst, könntest du sie in einen extern "C" Block einschließen.

z.B.
extern "C"
{
void func1()
{
}
}


käptn 30.10.2006 14:13

Du musst die Funktion bzw. Datei einkompilieren, oder damit verlinken...

Code:

mike@honeybadger:~/devel/testimonials$ g++ -o ex++ ex++.cxx ex.c
mike@honeybadger:~/devel/testimonials$ ./ex++
Hello World
mike@honeybadger:~/devel/testimonials$ cat ex.c
#include <stdio.h>

int foo(void)
{
        printf("Hello World\n");
        return 0;
}
mike@honeybadger:~/devel/testimonials$ cat ex++.cxx
int foo(void); // oder header incl.

class FooClass {
        public:
        FooClass() {
                (void) foo();
        }
};

int main(int argc, char **argv)
{
        FooClass *foo = new FooClass();
        delete foo;
        return 0;
}

~

Take_Five 30.10.2006 16:44

hmmm,.... ich hab folgendes:

lm_eval.h schaut so aus:

lm_minimize(...);
lm_evaluate(...);
...

lm_eval.c schaut dann so aus:

#include "lm_eval.h"
...
void lm_minimize (...)
{ ...
}

... lm_evaluate(...)
{
}

das Gleiche gibts dann nochmals für lmmin.h und lmmin.c

und fit1.cpp

#include "lmmin.h"
#include "lm_eval.h"
#include <stdio.h>

class something
{ public:
something(void)
{ lm_minimize();
}
};

int main(void)
{ something a;
}

so, Fehlermeldung: undefined reference to function lm_minimize(); at line irgendwas

käptn 30.10.2006 17:20

g++ -o prog fit1.cpp lm_eval.c ?

~

Take_Five 30.10.2006 17:29

nö, geht auch nicht:

Hier hab ich mal folgendes gemacht (nur zur Demonstartion)

gcc -c lmmin.c -o lmmin.o
gcc -c lm_eval.c -o lm_eval.o

gcc lm_test.c lmmin.o lm_eval.o -o lm_test

Funktioniert!! Und jetzt:

cp lm_test.c lm_test.cpp

gcc -g lm_test.cpp lmmin.o lm_eval.o -o lm_test

Fehlermeldung:

Undefined reference to lm_evaluate(...) , usw.

Take_Five 30.10.2006 17:31

g++ liefert gleiches Ergebnis

Take_Five 30.10.2006 17:53

OK, Problem gelöst. mit g++ fit1.cpp lm_eval.c ... gehts doch

Interessanterweise funktioniert g++ fit1.cpp lm_eval.o ... nicht

gcc fit1.c lm_eval.o aber schon

hmmm, naja, mit dem beschäftige ich mich später. Thx jedenfalls


Alle Zeitangaben in WEZ +2. Es ist jetzt 10:18 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
© 2009 FSL Verlag