函数“mknod”的隐式声明,但我包含了 headers
Implicit declaration of function ‘mknod’ but I have the headers included
我正在尝试制作一个使用命名管道与 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
在 mknod
运行后的值为 -1
,可能是因为编译器似乎无法找到该函数的实现。
如何让 GCC 知道在哪里可以找到 mknod
的实现?
我认为您缺少相应 headers 定义 mknod
所需的某些功能测试宏的定义。根据函数 (man 2 mknod
) 的 Linux 程序员手册,glibc 的宏是:
mknod():
_XOPEN_SOURCE >= 500
|| /* Since glibc 2.19: */ _DEFAULT_SOURCE
|| /* Glibc versions <= 2.19: */ _BSD_SOURCE || _SVID_SOURCE
尝试将 -D_XOPEN_SOURCE=500
添加到您的编译标志中,看看是否有帮助。
如您所见,要在预处理阶段后保留 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
或者您可以自己定义这些宏并将它们放在头文件包含之上。
我正在尝试制作一个使用命名管道与 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
在 mknod
运行后的值为 -1
,可能是因为编译器似乎无法找到该函数的实现。
如何让 GCC 知道在哪里可以找到 mknod
的实现?
我认为您缺少相应 headers 定义 mknod
所需的某些功能测试宏的定义。根据函数 (man 2 mknod
) 的 Linux 程序员手册,glibc 的宏是:
mknod(): _XOPEN_SOURCE >= 500 || /* Since glibc 2.19: */ _DEFAULT_SOURCE || /* Glibc versions <= 2.19: */ _BSD_SOURCE || _SVID_SOURCE
尝试将 -D_XOPEN_SOURCE=500
添加到您的编译标志中,看看是否有帮助。
如您所见,要在预处理阶段后保留 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
或者您可以自己定义这些宏并将它们放在头文件包含之上。