函数'mknod'的隐式声明但我包含了标题

时间:2016-04-08 18:03:57

标签: c linux named-pipes raspbian mknod

我正在尝试创建一个使用命名管道与Raspberry Pi 3上的C ++程序通信的C程序。

当我编译我的一些代码时,GCC正在吐出的警告:

/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");

fifo是int,在其他任何地方都没有使用,fp是管道的FILE*。我完成的一些调试表明fifo-1运行后的值为mknod,可能是因为编译器似乎无法找到函数的实现。

如何使GCC知道在哪里找到mknod的实现?

2 个答案:

答案 0 :(得分: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添加到编译标记中,看看是否有帮助。

答案 1 :(得分: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或者您可以自己定义这些宏并将它们放在头文件包含的上方。