У меня возникла странная проблема с ссылками после того, как я включил 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 для использования в пользовательском пространстве. https://lkml.org/lkml/2008/9/16/98
Та же проблема возникает в Linux 2.6, работающем в Centos 6, и Linux 4.0, работающем в Centos 7.
Любые идеи о том, что вызывает эту ошибку и как успешно включить inotify?
Решение. В определении функции отсутствовала точка с запятой в конце END объекта ObjectManager.h непосредственно перед #endif, и возникающая в результате ошибка GCC, которая распространялась по следующему, сложным образом, приводила к странной ошибке препроцессора в файле fcntl.h.
Других решений пока нет …