在我的程序中包含了inotify来监视文件系统的更改之后,我遇到了一个奇怪的链接问题。该项目在许多其他源文件中包含<fcntl.h>
。但是,当我在源文件中包含<sys/inotify.h>
时,它正在进行目录监视,我得到这个错误:
/usr/include/fcntl.h:30:1: error: expected initializer before ‘extern’
__BEGIN_DECLS
我的项目使用CMake,虽然这似乎与寻找通知无关。据我所知,它正在查找inotify声明,因为当我包含inotify_init()时,它抛出了一个错误,即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头实现中的一些问题。https://lkml.org/lkml/2008/9/16/98
同样的问题出现在Centos 6上运行的Linux 2.6和Centos 7上运行的Linux 4.0。
你知道是什么导致了这个错误,以及如何成功地包含inotify吗?
解决方案:函数定义在ObjectManager.h的END中缺少#endif前面的分号,由此产生的GCC错误以复杂的方式通过下一个include传播,导致fcntl.h中出现奇怪的预处理器错误。