GoogleTest 1.6 with Cygwin 1.7 compile error: '

2019-02-08 11:42发布

问题:

GoogleTest 1.6 with Cygwin 1.7: 'fileno' was not declared in this scope

Error message when building a simple test on Factorial() function in Eclipse CDT:

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 running gcc 4.7.3 on Cygwin 1.7.22

gTest 1.6 succesfully built including demo tests, with cmake 2.8.9 on Cygwin 1.7.22

I've linked the built lib with full path, E:\lib\gtest-1.6.0\Cygwin\libgtest.a

The following command option was added manually, got same error without it.

-DGTEST_OS_CYGWIN=1

Seems the errors have nothing to do with my code. Anyone using gTest with Eclipse and Cygwin?

Thank you,

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

回答1:

Setting the C++ standard to -std=gnu++0x rather than -std=c++0x, worked for me. You can try the statement:

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"

Setting symbol (-DGTEST_OS_CYGWIN=1) has got nothing to do with this error.



回答2:

Some functions go beyond the ANSI standard. These are disabled when you use std=c++11 (or std=c++0x).

Among them are fdopen, fileno and strdup. There are two possibilities to use them:

  • Use the GNU dialect (std=gnu++11).
  • If you want to compile without dialect and make a local exception, you can include stdio.h with the __STRICT_ANSI__ undefined. (see: Error "'fdopen' was not declared" found with g++ 4 that compiled with g++3)

I have tested both on Suse Linux Enterprise 11, MinGW and Cygwin.


Addition: Another (possibly better) way to access non-ANSI symbols would be to add

#define _POSIX_C_SOURCE 200809L

before the first #include in your file. This will give you access to most of the non-standard routines.

Some functions (e.g. realpath(...)) require

#define _BSD_SOURCE

to be inserted on top of your file.