带有Cygwin 1.7的GoogleTest 1.6编译错误:'fileno'未在此范围内声明

时间:2013-09-13 10:29:52

标签: c++ eclipse cygwin googletest

带有Cygwin 1.7的GoogleTest 1.6:'fileno'未在此范围内声明

在Eclipse CDT中对Factorial()函数构建简单测试时出现错误消息:

Invoking: Cygwin C++ Compiler
g++ -std=c++0x -DGTEST_OS_CYGWIN=1 -I"E:\source\gtest-1.6.0\include" -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"src/challenge.d" -MT"src/challenge.d" -o "src/challenge.o" "../src/challenge.cpp"
In file included from E:\source\gtest-1.6.0\include/gtest/internal/gtest-internal.h:40:0,
                 from E:\source\gtest-1.6.0\include/gtest/gtest.h:57,
                 from ../src/challenge.cpp:11:
E:\source\gtest-1.6.0\include/gtest/internal/gtest-port.h: In function 'int testing::internal::posix::FileNo(FILE*)':
E:\source\gtest-1.6.0\include/gtest/internal/gtest-port.h:1589:51: error: 'fileno' was not declared in this scope
E:\source\gtest-1.6.0\include/gtest/internal/gtest-port.h:1595:57: error: 'strdup' was not declared in this scope
E:\source\gtest-1.6.0\include/gtest/internal/gtest-port.h:1627:71: error: 'fdopen' was not declared in this scope

Eclipse CDT 8.1在Cygwin 1.7.22上运行gcc 4.7.3

gTest 1.6成功构建,包括演示测试,在Cygwin 1.7.22上使用cmake 2.8.9

我已将构建的lib与完整路径链接起来,E:\ lib \ gtest-1.6.0 \ Cygwin \ libgtest.a

手动添加了以下命令选项,没有它就得到了同样的错误。

-DGTEST_OS_CYGWIN=1

似乎错误与我的代码无关。有人使用gTest与Eclipse和Cygwin吗?

谢谢,

unsigned long Factorial(unsigned n) {
    return n==0? 0 : n*Factorial(n-1);
}

// Tests factorial of 0.
TEST(FactorialTest, HandlesZeroInput) {
  EXPECT_EQ(1, Factorial(0));
}

// Tests factorial of positive numbers.
TEST(FactorialTest, HandlesPositiveInput) {
  EXPECT_EQ(1, Factorial(1));
  EXPECT_EQ(2, Factorial(2));
  EXPECT_EQ(6, Factorial(3));
  EXPECT_EQ(40320, Factorial(8));
}

2 个答案:

答案 0 :(得分:20)

将C ++标准设置为-std = gnu ++ 0x而不是-std = c ++ 0x,对我有用。您可以尝试声明:

g++ -std=gnu++0x -DGTEST_OS_CYGWIN=1 -I"E:\source\gtest-1.6.0\include" -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"src/challenge.d" -MT"src/challenge.d" -o "src/challenge.o" "../src/challenge.cpp"

设置符号(-DGTEST_OS_CYGWIN = 1)与此错误无关。

答案 1 :(得分:9)

某些功能超出了ANSI标准。 当您使用std = c ++ 11(或std = c ++ 0x)时,这些被禁用。

其中包括fdopenfilenostrdup。 使用它们有两种可能性:

我已在Suse Linux Enterprise 11,MinGW和Cygwin上测试过。

添加:访问非ANSI符号的另一种(可能更好)方式是添加

#define _POSIX_C_SOURCE 200809L

在您文件中的第一个#include 之前。这将使您可以访问大多数非标准例程。

某些功能(例如realpath(...))需要

#define _BSD_SOURCE

插入文件顶部。