ubuntuusers.de

Eclipse und shm_open() Shared Memory

Status: Gelöst | Ubuntu-Version: Ubuntu 13.10 (Saucy Salamander)
Antworten |

sudo_-whattodo

Anmeldungsdatum:
3. Januar 2014

Beiträge: 111

Ich nutze Eclipse 3.8 und als Compiler den gcc. Wenn ich im Quelltext die Funktion shm_open() aufrufe bekomme ich immer den Fehler

1
Nicht definierter Verweis auf shm_open

Folgende Header-Dateien habe ich schon eingebunden.

1
2
3
#include <sys/mman.h>
#include <sys/stat.h>        
#include <fcntl.h>

Googled man das Problem, dann stößt man darauf dass man unter Eclipse

File > Properties > C/C++ Build > Settings > Miscellaneous

das Flag -pthread setzen muss, so dass bei mir jetzt steht -pthread -c -fmessage-length=0

Hier ist noch das komplette Kommando was Eclipse beim Compilieren erzeugt

gcc -O0 -g3 -Wall -pthread -c -fmessage-length=0

Und hier ein Screenshot der Include-Pfade

Ungültiges Makro

Dieses Makro ist nicht verfügbar

Seit geschlagenen 2 Stunden versuche ich nun das zum Laufen zu bekommen. Hat jemand noch eine Idee?

Bilder

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13205

Also, Du benutzt Eclipse als Entwicklungsumgebung und versuchst ein C-Programm zu übersetzen? Die Fehlermeldung sieht mir nach einer Linker-Meldung aus. Möglicherweise musst Du noch "-lpthread" hinzufügen. Ist aber schwer, das so zu beurteilen, ohne mehr Informationen zu haben.

Ciao

robert

sudo_-whattodo

(Themenstarter)

Anmeldungsdatum:
3. Januar 2014

Beiträge: 111

Ja, korrekt. Hab ich auch schon versucht. -lpthread bringt die gleiche Fehlermeldung.

pthread.h befindet sich auch in /usr/include

Und in den Settings > Library hab ich auch pthread eingetragen.

Dee Team-Icon

Avatar von Dee

Anmeldungsdatum:
9. Februar 2006

Beiträge: 20095

Wohnort: Schwabenländle

shm_open steckt ja in der libc, wenn ich nicht irre. Also würde ich im Compileraufruf ein "-lc" erwarten. Kannst Du den Compileraufruf mal manuell auf der Konsole eingeben und schauen, was da die Ausgabe meldet?

Gruß Dee

sudo_-whattodo

(Themenstarter)

Anmeldungsdatum:
3. Januar 2014

Beiträge: 111

Ich hab jetzt mal mit

1
gcc Caretaker.c -lc

compiliert und konnte ohne Probleme ./a.out starten.

Auch wenn ich mit

1
gcc Caretaker.c -o Caretaker

in der Shell compiliere kann ich die ausführbare Datei ohne Probleme mit ./Caretaker starten. Wenn ich nur mit

1
gcc Caretaker.c

compiliere, bekomme ich wieder folgende Fehlermeldung ...

1
2
3
/tmp/ccDwLhMv.o: In Funktion `main':
Caretaker.c:(.text+0x39): Nicht definierter Verweis auf `shm_open'
collect2: error: ld returned 1 exit status

Hier nochmal meine include-Liste die ich aktuell eingebunden habe

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
#include <fcntl.h>		/* Header for IPC_CREAT and IPC_EXCL */
#include <pthread.h>
#include <stdio.h>		/* Header for perror() */
#include <stdlib.h>		/* Header for exit() */
#include <sys/ipc.h>		/* Header for ???	*/
#include <sys/mman.h>		/* Header for shm_ Functions */
#include <sys/shm.h>		/* Header for Shared Memory Functions */
#include <sys/stat.h>		/* Header for Modes */
#include <sys/types.h>		/* Header for key_t */
#include <sys/wait.h>
#include <unistd.h>

In Eclipse bekomm ich den Fehler leider nicht weg. Was mir auch nicht ganz klar ist, wir haben von unserem Dozenten ein Script bekommen für die Interprozesskommunikation.

Unter der Überschrift POSIX - Shared Memory steht, "_POSIX_SHARED_MEMORY_OBJECTS muss in unistd.h gesetzt sein". Muss ich hierfür irgendetwas besonderes beachten?

sudo_-whattodo

(Themenstarter)

Anmeldungsdatum:
3. Januar 2014

Beiträge: 111

Habs jetzt doch noch hinbekommen. Ich hatte scheinbar vergessen "-lrt" hinzuzufügen. Nun klappt's. Für alle die irgendwann mal auf das gleiche Problem stoßen, hier meine Anleitung ...

1. rechte Maustaste auf das entsprechende Projekt
2. Properties
3. C/C++ Build
4. Settings
5. unter der Registerkarte Tool Settings den GCC C Linker suchen
6. Libraries
7. unter Libraries (-l) müssen nun die beiden Bibliotheken "pthread" und "rt" hinzugefügt werden, nacheinander und ohne Anführungsstriche

Gruß

Antworten |