externe Funktionen in C
-
Hallo zusammen,
ich bin beim C-programmieren ein anfänger. Ich habe folgendes Ziel:
Ich will eine Funktion programmieren, die ein Array aus nullen und einser erzeugt.
so ist das Prinzip der Funktion:
name: GenerateBitStream(int *bitfolge, 13)
also die funktionen erzeugt einen Array "Bitfolge" der länge 13. Inhalt vom Array ist zufällige Folge von Null und eins.
Ich bin folgender Massen gegangen:
1: Ich habe folgende Header Datei geschrieben (BitStream.h):---------------------------
#ifndef BitStream_h
#define BitStream_h#include<stdio.h>
#include<stdlib.h>extern int *GenerateBitStream(int*, int );
#endif
--------------------------2: dann habe ich die funktion GenerateBitStream.c geschrieben:
---------------------------
#include"BitStream.h"
#include<stdio.h>
#include<stdlib.h>
#include<time.h>int *GenerateBitStream(int *bits, int length){
srand48(time(NULL));
for (int i = 0; i <= length-1; i++) {
if (drand48() < 0.5)
*(bits+i) = 1;
else
*(bits+i) = 0;
}
return bits;
}
----------------------zum Testen der Funktion habe ich folgendes Testprogramm (test.c)geschrieben:
----------------------#include<stdio.h>
#include"BitStream.h"int main(){
int *BitSequence;
int i=0;GenerateBitStream(BitSequence,10);
for (i=0; i<10; i++){
printf("%d ",*(BitSequence+i));
}
}
-----------------------------Das Programm test.c habe ich so compiliert: "gcc test.c -o test" leider kommt folgende Fehlermeldung:
Undefined first referenced
symbol in file
GenerateBitStream /usr/tmp/ccp19vfe.o
ld: fatal: Symbol referencing errors. No output written to test
collect2: ld returned 1 exit statusMeine Frage wäre: gibts einen Fehler im Code? ist das zusammen binden der drei dateien test.c BitStream.h und GenerateBitStream so wie ich es gemacht habe richtig?
viele Grüsse
Dreisson
-
Benutze in Zukunft bitte Code-Tags (Syntaxhighlighting) für Quellcodeausschnitte.
dreisson schrieb:
Undefined first referenced
symbol in file
GenerateBitStream /usr/tmp/ccp19vfe.o
ld: fatal: Symbol referencing errors. No output written to test
collect2: ld returned 1 exit statusWie kommt die mehrspaltige Ausgabe der Fehlermeldung zustande? Das sieht ja arg komisch aus (am Stück müsste der Satz lauten "Undefined symbol GenerateBitStream first referenced in file /usr/tmp/xxp19vfe.o")
Das Programm test.c habe ich so compiliert: "gcc test.c -o test"
Hier liegt das Problem: Wie Du siehst, kommt in der Befehlszeile die Datei "GenerateBitStream.c" nicht vor - wo soll der Compiler die Definition der Funktion also finden? Du musst neben test.c auch diese Datei auf der Befehlszeile erwähnen.
-
Hallo,
bitte Codetags verwenden, danke.
Du musst die andere .c Datei auch noch mit angeben beim GCC Aufruf. Also quasi beide gleichzeitig kompilieren.
(Ansonsten müsstest du die zweite .c Datei vorkompilieren und die Objektdatei dann später hinzulinken)
-
Danke erst für die Anwort. Ich bin neu hier, habe nicht bemerkt dass es code Editor hier gibt. Ich werde es beim nächsten mal benutzen.
wie kann man die zweite .c datei vorkompilieren?
und wie sieht die kommando zeile wenn man beide .c Dateien gleichzeitig kompilieren will?
Gruss
-
Hallo,
also zunächst solltest du die offizielle Bedienungsanleitung in deine Lesezeichen aufnehmen. http://gcc.gnu.org/onlinedocs/
Insbesondere die Kapitel "Options for Linking" und "Options Controlling the Kind of Output" durchlesen.
Und hier noch eine Kurzanleitung zum Thema:
http://vergil.chemistry.gatech.edu/resources/programming/c-tutorial/libraries.html
-
Danke
das zweite Link ist genau was ich suche.
das erste Link ist sehr interessant und nützlich
-
Das Tutorial ist vielleicht etwas irreführend, weil es so aussieht, als müsste man unbedingt die .o Dateien bündeln um sie verwenden zu können.
Das ist nicht so, denn du kannst auch direkt die .o Objektdateien dazulinken ohne dass du erst eine Library draus machen müsstest.
-
int *BitSequence; int i=0; GenerateBitStream(BitSequence,10);
wird 100% schief gehen, da BitSequence ins Nimmerland zeigt. Richtig wäre
int BitSequence[10]; int i=0; GenerateBitStream(BitSequence,10);
-
Bei kompilieren von GenerateBitStream.c
#include"BitStream.h" #include<stdio.h> #include<stdlib.h> #include<time.h> int *GenerateBitStream(int *bits, int length){ srand48(time(NULL)); for (int i = 0; i <= length-1; i++) { if (drand48() < 0.5) *(bits+i) = 1; else *(bits+i) = 0; } return bits; }
kommt leider folgende Fehler:
GenerateBitStream.c: In function
GenerateBitStream': GenerateBitStream.c:14: parse error before
int'
GenerateBitStream.c:14:i' undeclared (first use in this function) GenerateBitStream.c:14: (Each undeclared identifier is reported only once GenerateBitStream.c:14: for each function it appears in.) GenerateBitStream.c:14: parse error before
)'`i' undeclared (first use in this function) : i habe ich doch deklariert : int i=0. Ich weiss nicht wegen was sind die Fehlermeldungen?
-
Diese Art der Deklaration (in for loops) ist nur in C99 und C++ erlaubt.
Zieh die Deklaration einfach raus eine Zeile darüber. Oder schalte den Compiler in den C99 Mode.
-
das Probleme war teilweise wegen Codefehler nicht ausführbar und grösstenteils wegen gcc version die ich erwende gcc 2.95.2. Problem ist nun gelöst.
liebe Grüsse.
Dreisson.
-
beim GCC solltest du mal -std=c99 ausprobieren.
und grösstenteils wegen gcc version die ich erwende gcc 2.95.2. Problem ist nun gelöst.
Nö. Aber warum verwendest du in Zeiten von GCC 4.2 immer noch den alten 2.95er? Ein Upgrade lohnt sich imho.
-
Deine Frage ist gerechtfetigt. Das computer an dem Ich arbeite gehört mir nicht, dazu kann drauf keine Programme installieren, da ich keine Adminstratorrechte habe. das hat mich schon genervt, immer wieder zu suchen ob es ein kommando in dieser älteren Version gibt oder nicht.
Gruss
Dreisson
-
Wenn es nur um die Administrator Rechte geht: Du kannst dir einen GCC auch in dein Home-Verzeichnis installieren. Ohne dass du Admin-Rechte brauchst.
Wenn das Projekt aber für den GCC 2.95 entwickelt werden soll, musst du wohl in den sauren Apfel beißen. :p