Linux: 将 inotify 与 fcntl 结合使用存在冲突
Linux: Conflicts using inotify with fcntl
在我的程序中包含 inotify 以监视对文件系统的更改后,我遇到了一个奇怪的链接问题。该项目在许多其他源文件中包含 <fcntl.h>
。但是,当我在进行目录监视的源文件中包含 <sys/inotify.h>
时,出现此错误:
/usr/include/fcntl.h:30:1: error: expected initializer before ‘extern’
__BEGIN_DECLS
我的项目使用 CMake,尽管这似乎与查找 inotify 无关。据我所知,它正在查找 inotify 声明,因为当我包含时,它抛出了一个错误,即 inotify_init() 和我使用的其他函数未定义。 Inotify 包括 fcntl 并且部分构建在其中的一些功能之上,所以我的第一个想法是它导入了与我程序的其余部分不同版本的 fcntl。
在ObjectManager.h中:
#ifndef MANAGE_OBJECT_H
#define MANAGE_OBJECT_H
#include "config.h"
//includes all lua headers under extern 'C'
#include <lua.hpp>
#include <list>
#include <unordered_map>
#include <pthread.h>
class ObjectManager //...
唯一改变的是 ObjectManager.cc,增加了 sys/notify 和观察者的实施(不包括在内,因为这是一个链接问题):
#include "config.h"
#include "ObjectManager.h"
#include "Control.h"
#ifdef OBJECT_MANAGER_ENABLED
#include <string.h>
#include <stdio.h>
#include <dirent.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <vector>
#include <unistd.h>
#include <fstream>
#include <sys/inotify.h>
//... inotify implementation
其中 Control.h 声明 #include <fcntl.h>
。
这是我发现的最接近的问题,与用户空间使用的不同 fcntl headers 的实现中的一些问题有关。 https://lkml.org/lkml/2008/9/16/98
在 Centos 6 上的 Linux 2.6 运行 和 Centos 7 上的 Linux 4.0 运行 上出现同样的问题。
关于导致此错误的原因以及如何成功包含 inotify 的任何想法?
解决方案:函数定义在 ObjectManager.h 的末尾处缺少分号,就在 #endif 之前,由此产生的 GCC 错误以复杂的方式传播到下一个包含,从而导致奇怪的预处理器错误在 fcntl.h.
在我的程序中包含 inotify 以监视对文件系统的更改后,我遇到了一个奇怪的链接问题。该项目在许多其他源文件中包含 <fcntl.h>
。但是,当我在进行目录监视的源文件中包含 <sys/inotify.h>
时,出现此错误:
/usr/include/fcntl.h:30:1: error: expected initializer before ‘extern’
__BEGIN_DECLS
我的项目使用 CMake,尽管这似乎与查找 inotify 无关。据我所知,它正在查找 inotify 声明,因为当我包含时,它抛出了一个错误,即 inotify_init() 和我使用的其他函数未定义。 Inotify 包括 fcntl 并且部分构建在其中的一些功能之上,所以我的第一个想法是它导入了与我程序的其余部分不同版本的 fcntl。
在ObjectManager.h中:
#ifndef MANAGE_OBJECT_H
#define MANAGE_OBJECT_H
#include "config.h"
//includes all lua headers under extern 'C'
#include <lua.hpp>
#include <list>
#include <unordered_map>
#include <pthread.h>
class ObjectManager //...
唯一改变的是 ObjectManager.cc,增加了 sys/notify 和观察者的实施(不包括在内,因为这是一个链接问题):
#include "config.h"
#include "ObjectManager.h"
#include "Control.h"
#ifdef OBJECT_MANAGER_ENABLED
#include <string.h>
#include <stdio.h>
#include <dirent.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <vector>
#include <unistd.h>
#include <fstream>
#include <sys/inotify.h>
//... inotify implementation
其中 Control.h 声明 #include <fcntl.h>
。
这是我发现的最接近的问题,与用户空间使用的不同 fcntl headers 的实现中的一些问题有关。 https://lkml.org/lkml/2008/9/16/98
在 Centos 6 上的 Linux 2.6 运行 和 Centos 7 上的 Linux 4.0 运行 上出现同样的问题。
关于导致此错误的原因以及如何成功包含 inotify 的任何想法?
解决方案:函数定义在 ObjectManager.h 的末尾处缺少分号,就在 #endif 之前,由此产生的 GCC 错误以复杂的方式传播到下一个包含,从而导致奇怪的预处理器错误在 fcntl.h.