У меня возникла странная проблема связывания после того, как я включил 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?
Можете ли вы дать нам минимальное количество кода, необходимого для репликации проблемы? –
Я обновлю все соответствующие #includes в исходном файле, используя inotify. Однако, если бы я знал минимальный код, который был релевантен для создания проблемы, я, вероятно, смог бы это выяснить - это сложная задача, и любой из них или многие из сотен исходных файлов могли бы внести свой вклад. – Leo
Тогда как вы ожидаете, что мы это выясним, даже не получив доступ к этим файлам? –