kann nicht kompilieren: client.msq.c:(.text+0x43): undefined reference to `smgget'
-
Hallo,
ich benutze Geany C editor mit Ubuntu 7.10.
Untenstehender Code läßt sich net Kompilieren wegen dieser Meldung:
gcc -Wall "client.msq.c" -w -o client.msq (im Verzeichnis: /media/sdb1) /tmp/ccPLHBrl.o: In function `main': client.msq.c:(.text+0x43): undefined reference to `smgget' collect2: ld gab 1 als Ende-Status zurück Übersetzung fehlgeschlagen.
Warum die Fehlermeldung?
#include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> #include <errno.h> #define WARTE_AUF_PLATZ_IN_QUEUE 0 #define MSG_KEY 1 #define MAX_LAENGE 200 int main(int argc , char **argv) { int iMsgId; int iTyp = 0; int iFlag; struct message { long mtype; char mtext[MAX_LAENGE]; }sMessage; iMsgId = smgget(MSG_KEY,0); /* Fehler wenn nicht vorhanden */ if(iMsgId < 0) { printf("Fehler %s bei msgget.\n", strerror(errno)); exit(-1); } while(iTyp != 50) { memset(sMessage.mtext, '\0', MAX_LAENGE); sprintf(sMessage.mtext, "20"); printf("Auftrag eingeben: \n"); printf("10 - addieren\n"); printf("20 - subtrahieren \n"); printf("30 - dividieren \n"); printf("40 - multiplizieren \n"); printf("50 - Ende \n"); scanf("%d", &iTyp); sMessage.mtype = iTyp; iFlag = WARTE_AUF_PLATZ_IN_QUEUE; if(msgsnd(iMsgId, &sMessage, strlen(sMessage.mtext) + 1 , iFlag) < 0) { printf("Fehler %s bei msgsnd \n" , strerror(errno)); } else { printf("gesendeter Text: <%s> \n" , sMessage.mtext); } } return 1; }
-
wo ist smgget
-
typo! sollte es nicht msgget heißen?
-
firefly schrieb:
typo! sollte es nicht msgget heißen?
sch... danke jungs!
-
20:23:45: Konnte »"./server.msq"« nicht ausführen (Start-Script konnte nicht erzeugt werden)
20:23:45: Konnte »"./server.msq"« nicht ausführen (Start-Script konnte nicht erzeugt werden)
Beide dateien kann ich erstellen/kompilen aber nicht ausführen, da bekomme ich obige Meldung. Kann mir jemand bitte helfen?
Hier nochmals kompletter Screenshot der Meldung:
http://666kb.com/i/axz12vr32nlv9ofhv.png
Hier nochmals ein Bild mit Einstellungen des gcc compiler:
http://666kb.com/i/axz190hl91yo6lpbn.png
Das ist noch der Code von der Server.msq.c datei:
#include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> #include <errno.h> #include <stdio.h> #define ERSTBESTE_NACHRICHT 0 #define WARTE_AUF_NACHRICHT 0 #define MSG_KEY 10001 #define MAX_LAENGE 200 main(void) { int iMsgId; int iPermFlag; struct message { long mtype; char mtext[MAX_LAENGE]; }sMessage; int iRc , iInt , iIndex , iFlag , iZahl; long lTyp; iPermFlag = 0660 | IPC_CREAT; /* erzeuge MSQ, falls nicht vorhanden */ if((iMsgId = msgget(MSG_KEY, iPermFlag)) < 0 ) { printf("Fehler bei msgget: %s \n" , strerror(errno)); exit(-1); } sMessage.mtype = -1; while(sMessage.mtype != 50) /* warte auf Nachricht des clients */ lTyp = ERSTBESTE_NACHRICHT; iFlag = WARTE_AUF_NACHRICHT; iRc = msgrcv(iMsgId, &sMessage, MAX_LAENGE, lTyp, iFlag); if(iRc == -1) { printf("Fehler %s \n" , strerror(errno)); } else { printf("Nachricht erhalten: %s \n" , sMessage.mtext); iZahl = atoi(sMessage.mtext); switch(sMessage.mtype) { case 10: printf("Addition: %d \n" , iZahl + iZahl); break; case 20: printf("Subtraktion: %d \n" , iZahl - iZahl); break; case 30: printf("Division: %d \n" , iZahl / iZahl); break; case 40: printf("Multiplikation: %d \n" , iZahl * iZahl); break; case 50: break; default: printf("Falscher Message-Typ: \n" , iZahl + iZahl); break; } } } }
Wie man auf dem Bild sieht:
http://666kb.com/i/axz1g2160i2q4pj77.png
konnte ich das Server Programm ausführen und es ist als Prozess in der linux Prozess liste aufgeführt, doch warum läd sich das client.msq Programm nicht als Prozess in den Speicher ???
-
so mittlerweile gehts...
nur warum bekomme ich diese Fehlermeldung "Permission denied bei MsgSnd" egal welche Zahl (10,20,30...) ich eingebe?
http://img224.imageshack.us/my.php?image=messagequeuefehlerscreenj0.png
-
wo ist MsgSnd?
-
rofler schrieb:
wo ist MsgSnd?
ich der client.msq.c datei ganz unten!
-
seh ich nicht
-
rofler schrieb:
seh ich nicht
da?:
if(msgsnd(iMsgId, &sMessage, strlen(sMessage.mtext) + 1 , iFlag) < 0) { printf("Fehler %s bei msgsnd \n" , strerror(errno)); }