GoogleTest 1.6 с ошибкой компиляции Cygwin 1.7: 'fileno' не был объявлен в этой области

GoogleTest 1.6 с Cygwin 1.7: «fileno» не был объявлен в этой области

Сообщение об ошибке при построении простого теста функции Factorial() в 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

Я связал встроенную библиотеку с полным путем, 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));
}

person Bill Clinton    schedule 13.09.2013    source источник


Ответы (2)


Установка стандарта С++ на -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) не имеет ничего общего с этой ошибкой.

person 302Found    schedule 18.09.2013
comment
Должен сказать, что я также экспериментировал с символом GTEST_OS_CYGWIN (результат тот же, т.е. ничего). Вероятно, это потому, что c++0x не включает posix. - person Tomasz Gandor; 14.01.2014
comment
Это также работает для решения аналогичной проблемы с QNX 6.6 Momentics 5.0. - person jwernerny; 02.10.2014

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

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

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


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

#define _POSIX_C_SOURCE 200809L

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

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

#define _BSD_SOURCE

для вставки поверх вашего файла.

person ManuelAtWork    schedule 05.10.2015