首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >函数‘mknod’的隐式声明,但我包含了标题

函数‘mknod’的隐式声明,但我包含了标题
EN

Stack Overflow用户
提问于 2016-04-08 18:03:56
回答 2查看 1.7K关注 0票数 2

我正在尝试制作一个C程序,它使用命名管道在Raspberry 3上与C++程序通信。

GCC在编译我的一些代码时发出的警告:

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

下面是函数的代码,包括它上面的#if:

代码语言:javascript
复制
#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));

下面是我在文件中的内容:

代码语言:javascript
复制
#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>

程序尝试在这里创建管道:

代码语言:javascript
复制
umask(0);
fifo = mknod(PIPE_LOC, S_IFIFO|0666, 0);
fp = fopen(PIPE_LOC, "w");

fifo是一个int,不被其他地方使用,fp是管道的FILE*。我所做的一些调试表明,fifo在运行mknod之后有一个值-1,这可能是因为编译器似乎无法找到函数的实现。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-04-08 18:35:17

可以看到,为了使mknod()函数的声明在预处理阶段之后保持不变,应该定义三个宏中的一个(__USE_MISC, __USE_BSD, __USE_XOPEN_EXTENDED)。否则,在预处理阶段将删除mknod()的声明。

代码语言:javascript
复制
#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或您可以自己定义这些宏,并将它们放在头文件包含的上方。

票数 2
EN

Stack Overflow用户

发布于 2016-04-08 18:19:00

我认为您遗漏了定义mknod所需的某些特性测试宏的定义。根据Linux程序员的函数手册(man 2 mknod),用于glibc的宏是:

():自glibc 2.19::*/ _DEFAULT_SOURCE溶胶

尝试将-D_XOPEN_SOURCE=500添加到编译标志中,以查看这是否有帮助。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36506375

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档