2013-09-13 3 views
14

GoogleTest 1,6 с Cygwin 1.7: «fileno» не был объявлен в этой областиGoogleTest 1,6 с Cygwin ошибки 1,7 компиляции: «fileno» не был объявлен в этой области

сообщение

Ошибка при создании простой тест на Факториал() функция в 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 работает GCC 4.7.3 на Cygwin 1.7.22

GTEST 1,6 успешно построен в том числе демонстрационные тесты, с CMake 2.8.9 на Cygwin 1.7.22

Я связал построенный 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)); 
} 

ответ

18

Установка стандарта C++ для -std = гну ++ 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" 

символ Setting (-DGTEST_OS_CYGWIN = 1) не имеет ничего общего с этой ошибкой.

+0

Должен сказать, что я также экспериментировал с символом GTEST_OS_CYGWIN (с таким же результатом, т.е.ничего). Наверное, это потому, что C++ 0x не включает posix. –

+0

Это также помогает решить аналогичную проблему с QNX 6.6 Momentics 5.0. – jwernerny

7

Некоторые функции выходят за рамки стандарта ANSI. Они отключены, если вы используете std = C++ 11 (или std = C++ 0x).

Среди них fdopen, fileno и strdup. Есть две возможности для их использования:

  • Используйте говор GNU (станд = гну ++ 11).
  • Если вы хотите скомпилировать без диалекта и сделать локальное исключение, вы можете включить stdio.h с неопределенным значением __STRICT_ANSI__. (см.: Error "'fdopen' was not declared" found with g++ 4 that compiled with g++3)

Я тестировал оба на Suse Linux Enterprise 11, MinGW и Cygwin.


Дополнение Другой (возможно лучше) способ доступа символов, не ANSI бы добавить

#define _POSIX_C_SOURCE 200809L 

перед первым #include в файле. Это даст вам доступ к большинству нестандартных процедур.

Некоторые функции (например, realpath(...)) требуют

#define _BSD_SOURCE 

быть вставлены в верхней части файла.

Смежные вопросы