2016-04-08 16 views
2

が含まれていますアウト私は私のいくつかのコードのコンパイル時に:ここで暗黙の宣言は「MKNOD」が、私は、ヘッダーは、私はGCCを吐きされるラズベリーパイ3.</p> <p>警告上のC++プログラムとの通信に名前付きパイプを使用して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はどこにも使用され、fpはされないが、intで、ここでは、私はファイルを持っていることを含んでいますパイプへのFILE*。私が行ったデバッグの中には、mknodが実行された後にfifoの値が-1であることが示されています。これは、コンパイラが関数の実装を見つけることができないように思われるためです。

GCCがmknodの実装を見つける場所を知るようにするにはどうすればよいですか?

+1

名前付きパイプを作成するより移植性の高い方法は、POSIXの 'mkfifo'関数です。 –

答えて

2

mknod()の宣言では、前処理段階の後に滞在する機能があることがわかりましたので、3つのマクロ(__USE_MISC, __USE_BSD, __USE_XOPEN_EXTENDED)のいずれかを定義する必要があります。それ以外の場合は、前処理段階でmknod()の宣言が削除されます。 -std=gnu99 -D_GNU_SOURCEのか、自分でこれらのマクロを定義したヘッダファイルのインクルードの上にそれらを配置することができます

#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)); 

あなたは、コンパイラオプションを使用することができます。

+1

BRAVO!私は時間のトラックを保存しました。私はヘッダーの中のそれらのプリコンパイラ変数に気付きましたが、それらをすべて統治する1つの変数を認識していませんでした! -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を追加してみてください。

関連する問題

 関連する問題