![]() |
![]() |
|
|
|||||||
| Programmierung Rat & Tat für Programmierer |
![]() |
|
|
Themen-Optionen | Ansicht |
|
|
#1 |
|
Senior Member
![]() |
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
____________________________________
Nur die Übung trennt das Außergewöhnliche vom Gewöhnlichen |
|
|
|
|
|
#2 |
|
Hero
![]() Registriert seit: 04.09.2001
Beiträge: 894
|
hi,
du musst entwedr die .h Datei in deiner .cpp includen oder die aufgerufene Funktion als external deklarieren. fg hannes |
|
|
|
|
|
#3 |
|
Senior Member
![]() |
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?
____________________________________
Nur die Übung trennt das Außergewöhnliche vom Gewöhnlichen |
|
|
|
|
|
#4 |
|
bitte Mailadresse prüfen!
Registriert seit: 17.03.2002
Beiträge: 198
|
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() { } } |
|
|
|
|
|
#5 |
|
Inventar
![]() Registriert seit: 04.11.2001
Alter: 45
Beiträge: 2.150
|
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;
}
____________________________________
LOL - Mein erstes Post im Programmier Forum MACINTOSH - Most Applications Crash, If Not The Operating System Hangs |
|
|
|
|
|
#6 |
|
Senior Member
![]() |
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
____________________________________
Nur die Übung trennt das Außergewöhnliche vom Gewöhnlichen |
|
|
|
|
|
#7 |
|
Inventar
![]() Registriert seit: 04.11.2001
Alter: 45
Beiträge: 2.150
|
g++ -o prog fit1.cpp lm_eval.c ?
~
____________________________________
LOL - Mein erstes Post im Programmier Forum MACINTOSH - Most Applications Crash, If Not The Operating System Hangs |
|
|
|
|
|
#8 |
|
Senior Member
![]() |
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.
____________________________________
Nur die Übung trennt das Außergewöhnliche vom Gewöhnlichen |
|
|
|
|
|
#9 |
|
Senior Member
![]() |
g++ liefert gleiches Ergebnis
____________________________________
Nur die Übung trennt das Außergewöhnliche vom Gewöhnlichen |
|
|
|
|
|
#10 |
|
Senior Member
![]() |
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
____________________________________
Nur die Übung trennt das Außergewöhnliche vom Gewöhnlichen |
|
|
|
![]() |
| Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1) | |
|
|