【问题标题】:Implicit declaration of function ‘mknod’ but I have the headers included函数“mknod”的隐式声明,但我包含了标题
【发布时间】:2016-04-08 18:03:56
【问题描述】:

我正在尝试制作一个使用命名管道与 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 的实现?

【问题讨论】:

  • 一种更便携的创建命名管道的方法是mkfifo 函数,它是POSIX。

标签: c linux named-pipes raspbian mknod


【解决方案1】:

如您所见,要在预处理阶段后保留 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 或者您可以自己定义这些宏并将它们放在头文件包含之上。

【讨论】:

  • 太棒了!为我节省了一卡车的时间。我确实注意到标题中的那些预编译器变量,但不知道一个变量来统治它们! -D_GNU_SOURCE。我的代码是在 macOS Sierra 上编译的,但是当我在 RH 上构建它时,我遇到了 popen、getopt、strdup 等错误……你的建议修复了它!
【解决方案2】:

我认为您缺少定义 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 添加到您的编译标志中,看看是否有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-20
    • 1970-01-01
    • 2014-06-22
    • 2020-09-01
    • 2021-01-20
    • 1970-01-01
    相关资源
    最近更新 更多