2010-05-17 17 views
2

Je suis en train de compiler un code source dans Cygwin (dans Windows 7) et obtenir l'erreur suivante lorsque je lance le fichier makefileproblèmes compiliing C++ code à l'aide Cygwin

g++ -DHAVE_CONFIG_H -I. -I.. -I.. -Wall -Wextra -Werror -g -O2 -MT libcommon_a Fcntl.o -MD -MP -MF .deps/libcommon_a-Fcntl.Tpo -c -o libcommon_a-Fcntl.o `test -f 'Fcntl.cpp' || echo './'`Fcntl.cpp 
Fcntl.cpp: In function int setCloexec(int): 
Fcntl.cpp:8: error: 'F_GETFD' was not declared in this scope 
Fcntl.cpp:8: error: 'fcntl' was not declared in this scope 
Fcntl.cpp:11: error: 'FD_CLOEXEC' was not declared in this scope 
Fcntl.cpp:12: error: 'F_SETFD' was not declared in this scope 
make[4]: *** [libcommon_a-Fcntl.o] Error 1 
make[4]: Leaving directory `/abyss-1.1.2/Common' 
make[3]: *** [all-recursive] Error 1 
make[3]: Leaving directory `/abyss-1.1.2' 
make[2]: *** [all] Error 2 
make[2]: Leaving directory `/abyss-1.1.2' 
make[1]: *** [.build-conf] Error 2 
make[1]: Leaving directory `/cygdrive/c/Users/Martin/Documents/NetBeansProjects/abyss-1.1.2_1' 
make: *** [.build-impl] Error 2 

Le fichier problème est: -

#include "Fcntl.h" 
#include <fcntl.h> 


/* Set the FD_CLOEXEC flag of the specified file descriptor. */ 
int setCloexec(int fd) 
{ 
int flags = fcntl(fd, F_GETFD, 0); 
if (flags == -1) 
    return -1; 
flags |= FD_CLOEXEC; 
return fcntl(fd, F_SETFD, flags); 
} 

Je ne comprends pas ce qui se passe, le fichier fcntl.h est disponible et les varaiables qu'il dit n'a pas été déclaré dans ce champ ne donnent pas une erreur quand je compilez le fichier lui-même

Toute aide serait appréciée

Merci beaucoup

+1

Peut-être à cause de la collision de noms, comme sur win 'fcntl.h' et' Fcntl.h' pointent vers les mêmes fichiers et (je ne pense pas que ce soit le cas, mais stil ...) vous pourriez être en fait en incluant le même fichier - vérifiez vos paramètres de répertoires inclus. –

Répondre

1

Je n'ai pas les choses construit avec Cygwin, donc cela pourrait être hors de la base, mais étant donné que vous construisez sur Windows, qui a système de fichiers insensible à la casse, êtes-vous sûr que le compilateur peut faire la différence entre votre en-tête Fcntl.h et l'en-tête système fcntl.h? Il se peut que votre en-tête soit inclus deux fois et ne reçoive jamais l'en-tête du système.

+0

Vous êtes sur la cible. FAT32 et NTFS préservent la casse, mais pas la casse. En tant que tel, vous ne pouvez pas avoir un Makefile et un makefile dans le même répertoire, car ils seraient considérés comme ambigus. Ou, dans ce cas, lors de la recherche de "Fcntl.h", il trouve le système comme le fait la recherche . Vous devez renommer Fcntl.h dans le répertoire source en myFcntl.h et ajuster l'inclusion de manière appropriée. (Laissez le système fcntl.h seul.) –

1

Qu'est-ce qui se passe avec ces instructions #include? Il semble que vous ayez un fichier d'en-tête dans votre projet appelé Fcntl.h, n'est-ce pas? Est-ce qu'il y a des gardes? Si c'est le cas, peut-être que vous utilisez accidentellement le même garde que l'en-tête intégré, et par conséquent ne pas obtenir son contenu. Cygwin fonctionne normalement sur un système de fichiers insensible à la casse, donc même donner à ces en-têtes des noms similaires est probablement dangereux.