*.o-Datei einbinden?
lima-city → Forum → Programmiersprachen → C/C++ und D
angabe
aufrufen
bedeutet optimieren
code
compiler
dank
datei
erneute einbinden
fehler
frage
funktion
header
letzten satz
parameter
prinzip
programmierer
projekt
vergessen
verwenden
zeile
-
Hallo...
Mal ne ganz blöde Frage: Ich hab zwei Dateien: math.h und math.c.
Diese beinhalten zwei Algorithmen:
devide(int x, int y); und kgv(int a, int b);
Jetzt hab ich noch eine main.c wo die zwei Algos verwendet werden.
Nach dem Kompilieren hab ich im Verzeichnis die Datei "math.o" und "main.o".
Ich hab mir sagen lassen, dass die Datei "math.o" meine Header-Datei im kompilierten, sprich: binären, Zustand ist.
Kann ich diese Datei mit den enthaltenen Algorithmen nun in einem anderen Programm verwenden?
Wenn ja: Wie muss ich sie inkludieren?
Ich habs mit include "math.o" versucht, was aber zu einem sehr langen Compiler-Fehler führte.
Ich weiß, dass man sie verwenden kann, aber leider nicht wie...
Danke schonmal an die fortgeschrittenen C-Programmierer... -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
besorg dir ma nen zeitgemäßen compiler bzw. entwicklungsumgebung!
Diese *.o datei (object) is fertig compiliert. die musst du beim kompilieren deines projekts einbinden, aber nicht im quelltext!
z.B. (g++):
g++ -c vector.c
g++ -o vectest vector.o vectest.c
vector.o ist compiliertes vector.c.
-o bedeutet optimieren.
d.h. für dein Problem sieht das so aus:
g++ -c math.c
erstellt math.o
g++ -o name math.o main.c
und dann dürfte es fertig sein.
wenn du mehrere dateien hast, dann erzeuge erst alle *.o dateien (außer das testprogramm) mit:
g++ -c name.c
danach fügst du sie dem testprog hinzu:
g++ -o name name.o name2.o name3.o main.c
hoffe es klappt, bin nun schon einwenig raus. (bei fragen pn)
die "-"befehle sind bei den meisten "alten" kompillern gleich.
*.h dateien werden im quelltext der *.cpp datei includiert. spielt sonst keine rolle mehr.
MfG
Beitrag geändert: 16.10.2008 2:21:07 von koslo -
Ich hab mir sagen lassen, dass die Datei "math.o" meine Header-Datei im kompilierten, sprich: binären, Zustand ist.
Nein. Bei *.o Dateien handelt es sich um compilierte *.c Dateien, die aber noch gelinkt werden müssen.
Linken beudetet, dass, wenn du jetzt z.B. deine math.c und deine main.c jede für sich compilierst, du nach dem linken eine einzige, ausführbare Datei bekommst, bei der du alle Funktionen aufrufen kannst.
Header Dateien spielen dabei folgende Rolle:
Wenn der Compiler den Quelltext durchgeht, dann muss er ja wissen, was für Parameter eine Funktion hat. Dies weiß er entweder, weil die Funktion selber schon weiter oben direkt definiert wurde, oder, weil die Deklaration in einer Header-Datei steht.
(Man kann natürlich die Funktionsdeklarationen auch in die Datei selber schreiben und sich die Header-Datei schenken. Das ist aber kein guter Stil. Header-Dateien sind auch keine besonderen Dateien, sondern haben nur den Zweck, die ganze Kolonne von Funktionsdeklarationen auszulagern, damit man, wenn man eine C-Datei öffnet nicht erstmal endlos lange scrollen muss, bis man zu den eigentlichen Funktionen kommt)
Sobald der Compiler dann die Datei durch hat, fängt der Linker an zu arbeiten, um die Funktionsaufrufe in Adressen umzurechnen. Wenn jetzt eine Funktion zwar deklariert, aber nicht definiert ist, gibt es einen Fehler.
(Wie man das umgeht steht weiter unten)
Um jetzt einige Dateien zu einer einzigen, ausführbaren Datei zu machen, kann man einfach alle *.c Dateien in den Compiler füttern.
Dabei müssen alle aufgerufenen Funktionenen deklariert und irgendwo auch definiert sein. Der Compiler produziert dann in einem Durchlauf eine ausführbare Datei.
Jetzt kann man aber auch noch einen Zwischenschritt einbauen, so dass er nicht direkt eine ausführbare Datei erzeugt, sondern erstmal nur ungelinkte Dateien. Das ist vorteilhaft, wenn mit sehr großen Sourcecode-Dateien arbeitet.
Wenn man eine Datei im ganzen Projekt verändert, muss man nicht das ganze Projekt neu compilieren, sondern nur diese eine Datei.
Das Linken selber geht dann schnell.
In Diesem Zusammenhang sind Makefiles auch sehr praktisch, weil man dadurch gezielt nur die Dateien compiliert, die auch verändert wurden.
Mit gcc/g++ sieht das dann so aus:
gcc -c -o meinteilprogramm.o meinteilprogramm.c
Wobei -c Dafür sorgt, dass der Linker (noch) nicht aktiviert wird, so dass man auch Funktionen aufrufen kann, die eigentlich in einer anderen Datei definiert sind.
Und die -o Option legt den Namen der Ausgabedatei fest.
Um dann die *.o Dateien zusammenzufügen, macht man einfach
gcc -o meinProgramm datei1.o datei2.o datei3.o
p.s. Wenn du reines C programmierst, empfiehlt es sich gcc als Compiler zu benutzen. Während für C++ Dateien g++ besser geeignet ist.
@koslo:
g++ -c vector.c g++ -o vectest vector.o vectest.c vector.o ist compiliertes vector.c. -o bedeutet optimieren.
-o Ist, wie ich bereits geschrieben habe, die Angabe, wie die Ausgabedatei heißen soll. Du meinst wahrscheinlich -O (also großes O).
Das erneute Einbinden der *.c Datei in Zeile 3 sollte überflüssig sein.
Beitrag geändert: 16.10.2008 8:34:00 von bladehunter -
Man glaube es kaum, es funktioniert... :-)
Aber, da ich auf korrektheit achte, muss ich nochmals nachhacken:
PS C:\Users\schrotti12\Desktop\kgv2> gcc -o kgv math.o main.c -pedantic -Wall -ansi main.c: In function `main': main.c:16: warning: implicit declaration of function `kgv'
Was muss ich machen, damit das nicht kommt??
Oder muss ich damit halt leben?
Ich hab auch schon versucht, vor dem Main die beiden Funktionne zu definieren...
Daz habe ich das eingefügt:
int kgv(int a, int b); int devide(int x, int y);
Aber leider kommt die Fehlermeldung trotzdem...
Und danke für die Antworten...
lg
schrotti12 -
Bin mir zwar nicht ganz sicher, aber liegt es vielleicht an deinen Return-Parametern?
Wenn du die beiden Methoden vorher deklarierst (mit int und auch in deiner Definition int verwenden), sollte das eigentlich schon funktionieren?!
greetz,
K. -
Ich habs gelöst:
Ich hab vergessen, die *.h-Datei in den Ordner zu geben...
Also ich hab nur die main.c- und math.o-Datei drinnen gehabt und die Header-Datei vergessen...
Klar, dass der Compiler die Funktionen nicht findet...
Kann geschlossen werden...
Danke!
lg
schhrotti12 -
bladehunter schrieb:
@koslo:
g++ -c vector.c g++ -o vectest vector.o vectest.c vector.o ist compiliertes vector.c.
-o Ist, wie ich bereits geschrieben habe, die Angabe, wie die Ausgabedatei heißen soll. Du meinst wahrscheinlich -O (also großes O).
Das erneute Einbinden der *.c Datei in Zeile 3 sollte überflüssig sein.
hast ja recht das -o die ausgebedatei ist, wie gesagt bin schon ne weile raus. aber was meinst du mit deinem letzten satz.
Ich hatte es ma so gelernt und es dürfte nicht falsch sein. -
Also mit dem letzten Satz ist gemeint, dass die Datei "vector.o" die kompilierte Version von "vector.c" ist.
Das heißt, man kann aus dieser Datei nicht ersehen, wie die Algorithmen darin implementiert sind, was bei der Soucre-Datei durchaus möglich ist.
Da durch, dass man die Header-Datei hat, weiß man, wie man die Funktionen ansprechen kann, aber wie sie intern arbeiten, weiß nur der Programmierer. Sprich: Ob jetzt ein Feld verwendet wird, oder eine verkettete Liste oder sonstwas...
Dadurch wird das Geheimnis-Prinzip realisiert! -
lol.
das is mir doch klar, schrotti12. ich meinte den satz:
"Das erneute Einbinden der *.c Datei in Zeile 3 sollte überflüssig sein."
bezogen auf mein code:
g++ -c vector.c g++ -o vectest vector.o vectest.c vector.o ist compiliertes vector.c.
und du (schrotti12) hast es ja im Prinzip auch so gemacht.
Wahrscheinlich hat bladehunter überlesen, dass die *.c datei eine andere ist, nähmlich die mit der main-Funktion.
MfG
Beitrag geändert: 17.10.2008 13:47:53 von koslo -
Ja, eh...
Im Grunde genommen braucht man auch nur die "main.c", in der auf die Funktionen zugegriffen wird, die Header-Dateien, wo drinnen steht, welche Funktionen es gibt, und die Object-Datei, welche den Code beinhaltet... -
und du (schrotti12) hast es ja im Prinzip auch so gemacht.
Wahrscheinlich hat bladehunter überlesen, dass die *.c datei eine andere ist, nähmlich die mit der main-Funktion.
Du hast mit deiner Vermutung Recht. Ich hätte genauer hinschauen sollen -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage