WCM - Das österreichische Computer Magazin Forenübersicht
 

Zurück   WCM Forum > Rat & Tat > Programmierung

Programmierung Rat & Tat für Programmierer

Microsoft KARRIERECAMPUS

Antwort
 
Themen-Optionen Ansicht
Alt 28.10.2006, 23:43   #1
Take_Five
Senior Member
 
Registriert seit: 09.06.2001
Beiträge: 138


Take_Five eine Nachricht über ICQ schicken
Standard 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
____________________________________
Nur die Übung trennt das Außergewöhnliche vom Gewöhnlichen
Take_Five ist offline   Mit Zitat antworten
Alt 29.10.2006, 10:49   #2
Biri
Hero
 
Registriert seit: 04.09.2001
Beiträge: 894


Standard

hi,

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

fg
hannes
Biri ist offline   Mit Zitat antworten
Alt 29.10.2006, 22:24   #3
Take_Five
Senior Member
 
Registriert seit: 09.06.2001
Beiträge: 138


Take_Five eine Nachricht über ICQ schicken
Standard

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
Take_Five ist offline   Mit Zitat antworten
Alt 30.10.2006, 06:56   #4
delphirocks
bitte Mailadresse prüfen!
 
Registriert seit: 17.03.2002
Beiträge: 198


Standard

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()
{
}
}

delphirocks ist offline   Mit Zitat antworten
Alt 30.10.2006, 14:13   #5
käptn
Inventar
 
Registriert seit: 04.11.2001
Alter: 45
Beiträge: 2.150


Standard

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
käptn ist offline   Mit Zitat antworten
Alt 30.10.2006, 16:44   #6
Take_Five
Senior Member
 
Registriert seit: 09.06.2001
Beiträge: 138


Take_Five eine Nachricht über ICQ schicken
Standard

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
Take_Five ist offline   Mit Zitat antworten
Alt 30.10.2006, 17:20   #7
käptn
Inventar
 
Registriert seit: 04.11.2001
Alter: 45
Beiträge: 2.150


Standard

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
käptn ist offline   Mit Zitat antworten
Alt 30.10.2006, 17:29   #8
Take_Five
Senior Member
 
Registriert seit: 09.06.2001
Beiträge: 138


Take_Five eine Nachricht über ICQ schicken
Standard

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
Take_Five ist offline   Mit Zitat antworten
Alt 30.10.2006, 17:31   #9
Take_Five
Senior Member
 
Registriert seit: 09.06.2001
Beiträge: 138


Take_Five eine Nachricht über ICQ schicken
Standard

g++ liefert gleiches Ergebnis
____________________________________
Nur die Übung trennt das Außergewöhnliche vom Gewöhnlichen
Take_Five ist offline   Mit Zitat antworten
Alt 30.10.2006, 17:53   #10
Take_Five
Senior Member
 
Registriert seit: 09.06.2001
Beiträge: 138


Take_Five eine Nachricht über ICQ schicken
Standard

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
Take_Five ist offline   Mit Zitat antworten
Antwort


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.

Gehe zu


Alle Zeitangaben in WEZ +2. Es ist jetzt 01:32 Uhr.


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