2016-04-08 28 views
2

我試圖讓使用命名管道與一個樹莓派3的功能隱式聲明「MKNOD」,但我有頭包括

警告一個C++程序,GCC咳通信的C程序出當我編譯我的一些代碼:

/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*到管道。我所做的一些調試顯示fifomknod運行後的值爲-1,這可能是因爲編譯器看起來不能找到該函數的實現。

我該如何做到讓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!爲我節省了大量的時間。我在頭文件中注意到了這些預編譯器變量,但沒有意識到一個變量可以將它們全部統一起來! -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到你的編譯標誌來看看是否有幫助。