Linux:使用inotify与fcntl发生冲突

时间:2016-08-29 22:01:15

标签: c++ linux cmake inotify fcntl

在我的程序中包含inotify以监视文件系统的更改后,我遇到了一个奇怪的链接问题。该项目在许多其他源文件中包含:verbose map <D+ä>。但是,当我在执行目录监视的源文件中包含imap öö <ESC> 时,出现此错误:

<fcntl.h>

我的项目使用CMake,虽然这似乎与查找inotify无关。它是根据我的知识找到inotify声明,因为当我包含它时,它抛出了一个错误,即inotify_init()和我使用的其他函数没有被定义。 Inotify包含fcntl,部分建立在那里的一些功能之上,所以我首先想到的是它导入的fcntl版本比我程序的其他版本更多。

在ObjectManager.h中:

<sys/inotify.h>

唯一改变的是ObjectManager.cc,增加了sys / notify和观察者的实现(不包括因为这是一个链接问题):

/usr/include/fcntl.h:30:1:  error: expected initializer before ‘extern’
 __BEGIN_DECLS

Control.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 //... 。 这是我发现的最接近的问题,与用户空间使用的不同fcntl头的实现中的一些问题有关。 https://lkml.org/lkml/2008/9/16/98

在Centos 6上运行的Linux 2.6和Centos 7上运行的Linux 4.0上也会出现同样的问题。

有关导致此错误的原因以及如何成功包含inotify的任何想法?

1 个答案:

答案 0 :(得分:0)

解决方案:函数定义在#endif之前的ObjectManager.h的END处缺少分号,并且通过下一个传播的结果GCC错误以复杂的方式包含,导致fcntl.h中出现奇怪的预处理器错误