3

cygwin (Windows 7) でいくつかのソース コードをコンパイルしようとしていますが、make ファイルを実行すると次のエラーが発生します。

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

問題のファイルは次のとおりです。

#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);
}

何が起こっているのかわかりません。ファイル fcntl.h が利用可能であり、このスコープで宣言されていないという変数は、ファイルを単独でコンパイルしてもエラーになりません。

どんな助けでも大歓迎です

どうもありがとう

4

2 に答える 2

1

それらの#include声明はどうなっていますか?プロジェクトに というヘッダー ファイルがあるようですが、そうFcntl.hですか? ガードが含まれていますか?含まれている場合は、誤って組み込みヘッダーと同じガードを使用している可能性があり、その結果、その内容を取得できません。Cygwin は通常、大文字と小文字を区別しないファイルシステムで実行されるため、これらのヘッダーに似たような名前を付けることはおそらく危険です。

于 2010-05-17T21:26:12.353 に答える
1

私は Cygwin でビルドしたことがないので、これはベース外かもしれませんが、大文字と小文字を区別しないファイルシステムを持つ Windows でビルドしていることを考えると、コンパイラーがヘッダーFcntl.hとヘッダーの違いを認識できると確信していますか?システムヘッダfcntl.h? ヘッダーを 2 回インクルードしているだけで、システム ヘッダーを取得していない可能性があります。

于 2010-05-17T21:23:08.383 に答える