2016-08-29 11 views
-1

У меня возникла странная проблема связывания после того, как я включил inotify в свою программу для мониторинга изменений в файловой системе. Проект включает в себя <fcntl.h> во многих других исходных файлах. Однако, когда я включаю <sys/inotify.h> в исходном файле, который делает мониторинг каталога, я получаю эту ошибку:Linux: Конфликты, использующие inotify с помощью fcntl

/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/уведомление и реализация наблюдателя (не входит, потому что это вопрос сшивание):

#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?

+1

Можете ли вы дать нам минимальное количество кода, необходимого для репликации проблемы? –

+0

Я обновлю все соответствующие #includes в исходном файле, используя inotify. Однако, если бы я знал минимальный код, который был релевантен для создания проблемы, я, вероятно, смог бы это выяснить - это сложная задача, и любой из них или многие из сотен исходных файлов могли бы внести свой вклад. – Leo

+1

Тогда как вы ожидаете, что мы это выясним, даже не получив доступ к этим файлам? –

ответ

0

Разрешение: определение функции не имело точки с запятой в END объекта ObjectManager.h прямо перед #endif, а результирующая ошибка GCC, которая распространялась через следующую, включается сложным образом, что приводит к странной ошибке препроцессора в fcntl. час

 Смежные вопросы

  • Нет связанных вопросов^_^