2016-04-08 10 views
2

enthalten Ich versuche, ein C-Programm zu machen, die Named Pipes verwendet, um mit einem C++ Programm auf einem Raspberry Pi 3.Implizite Deklaration der Funktion ‚mknod‘ aber ich habe die Header

die Warnung zu kommunizieren, die GCC Spucken ist aus, wenn ich einige Code von mir kompilieren:

/home/pi/BluetoothTest/btooth.c|76|warning: implicit declaration of function ‘mknod’ [-Wimplicit-function-declaration]|

Hier ist der Code aus für die Funktion, einschließlich der #if darüber:

#if defined __USE_MISC || defined __USE_BSD || defined __USE_XOPEN_EXTENDED 
extern int mknod (const char *__path, __mode_t __mode, __dev_t __dev) 
    __THROW __nonnull ((1)); 

und hier sind die beinhaltet, dass ich in der Datei haben:

#include <stdlib.h> 
#include <stdio.h> 
#include <unistd.h> 
#include <fcntl.h> 
#include <pthread.h> 
#include <sys/socket.h> 
#include <sys/stat.h> 
#include <sys/types.h> 
#include <bluetooth/bluetooth.h> 
#include <bluetooth/hci.h> 
#include <bluetooth/hci_lib.h> 
#include <bluetooth/rfcomm.h> 
//#include <linux/stat.h> 

Das Programm versucht, das Rohr hier zu erstellen:

umask(0); 
fifo = mknod(PIPE_LOC, S_IFIFO|0666, 0); 
fp = fopen(PIPE_LOC, "w"); 

Fifo ist ein int, die nirgendwo sonst verwendet wird und fp a FILE* an die Leitung. Ein Debugging, das ich gemacht habe, zeigt, dass fifo einen Wert von -1 hat, nachdem mknod ausgeführt wird, wahrscheinlich weil der Compiler nicht in der Lage scheint, die Implementierung der Funktion zu finden.

Wie kann ich sicherstellen, dass GCC weiß, wo die Implementierung von mknod zu finden ist?

+1

Eine portablere Möglichkeit, eine Named Pipe zu erstellen, ist die Funktion 'mkfifo', bei der es sich um POSIX handelt. –

Antwort

2

Wie Sie sehen, dass für die Deklaration von mknod() Funktion nach der Vorverarbeitungsstufe zu bleiben, sollte eine der drei Makros (__USE_MISC, __USE_BSD, __USE_XOPEN_EXTENDED) definiert werden. Andernfalls wird die Deklaration von mknod() während der Vorverarbeitungsphase entfernt.

#if defined __USE_MISC || defined __USE_BSD || defined __USE_XOPEN_EXTENDED 
extern int mknod (const char *__path, __mode_t __mode, __dev_t __dev) 
__THROW __nonnull ((1)); 

können Sie Compiler-Optionen verwenden: -std=gnu99 -D_GNU_SOURCE oder Sie können diese Makros auf eigene Faust und legen Sie sie über Header-Datei Aufnahme definieren.

+1

BRAVO! Sparte mir eine Wagenladung Zeit. Ich habe diese Pre-Compiler-Variable in den Headern bemerkt, war mir aber der einzigen Variablen nicht bewusst, die sie alle steuern sollte! -D_GNU_SOURCE. Mein Code kompilierte auf macOS Sierra, aber als ich ihn auf RH baute, bekam ich diesen Fehler für popen, getopt, strdup, etc ... und dein Vorschlag reparierte ihn! – clearlight

2

Ich denke, dass Sie eine Definition eines Feature-Test-Makros fehlt, die für die entsprechenden Header benötigt wird, um mknod zu definieren. Laut Handbuch Linux-Programmierer für die Funktion (man 2 mknod) die Makros für glibc sind:

mknod(): 
    _XOPEN_SOURCE >= 500 
     || /* Since glibc 2.19: */ _DEFAULT_SOURCE 
     || /* Glibc versions <= 2.19: */ _BSD_SOURCE || _SVID_SOURCE 

Try -D_XOPEN_SOURCE=500 auf Ihre Kompilierung Flags hinzugefügt, um zu sehen, ob das hilft.

Verwandte Themen