2016-04-08 5 views
2

Я пытаюсь сделать программу C, которая использует именованные каналы для связи с C++ программы на Raspberry Pi 3.неявного объявления функции «MKNOD», но у меня есть заголовки включены

предупреждения, что НКА разбрызгивания когда я скомпилировать код шахты:

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

Вот код из за функции, в том числе #if над ним:

#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)); 

и здесь являются включает в себя, что у меня есть в файле:

#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> 

Программа пытается создать трубу здесь:

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

ФИФО является int, который нигде не используется и является Ф.П. a FILE* к трубе. Некоторая отладка, которую я сделал, показывает, что fifo имеет значение -1 после того, как mknod запускается, вероятно, из-за того, что компилятор не может найти реализацию функции.

Как это сделать, чтобы GCC знал, где найти реализацию mknod?

+1

Более портативный способ создания именованного канала - это функция 'mkfifo', которая представляет собой POSIX. –

ответ

2

Как вы можете видеть, для объявления функции mknod() после этапа предварительной обработки необходимо определить один из трех макросов (__USE_MISC, __USE_BSD, __USE_XOPEN_EXTENDED). В противном случае объявление mknod() будет удалено на этапе предварительной обработки.

#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)); 

Вы можете использовать опции компилятора: -std=gnu99 -D_GNU_SOURCE или вы можете определить эти макросы самостоятельно и поместить их над включением заголовочного файла.

+1

BRAVO! Сохранял мне грузовик времени. Я заметил эту переменную pre-compiler в заголовках, но не знал об одной переменной, чтобы управлять ими всеми! -D_GNU_SOURCE. Мой код компилировался на macOS Sierra, но когда я построил его на RH, я получал эту ошибку для popen, getopt, strdup и т. Д. ... и ваше предложение исправило это! – clearlight

2

Я думаю, вам не хватает определения какого-либо макроса функции, необходимого для соответствующих заголовков, для определения mknod. Согласно Руководству программиста Linux для функции (man 2 mknod) макросы для Glibc являются:

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

Попробуйте добавить -D_XOPEN_SOURCE=500 к вашим флагам компиляции, чтобы увидеть, если это помогает.