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
Я связал построенный 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));
}
Ответы
Ответ 1
Установка стандарта С++ на -std = gnu ++ 0x, а не -std = С++ 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) не имеет ничего общего с этой ошибкой.
Ответ 2
Некоторые функции выходят за рамки стандарта ANSI.
Они отключены, если вы используете std = С++ 11 (или std = С++ 0x).
Среди них fdopen
, fileno
и strdup
.
Их можно использовать двумя способами:
Я тестировал как на Suse Linux Enterprise 11, MinGW, так и на Cygwin.
Дополнение: Другим (возможно, лучшим) способом доступа к символам, отличным от ANSI, было бы добавить
#define _POSIX_C_SOURCE 200809L
перед первым #include в вашем файле. Это даст вам доступ к большинству нестандартных процедур.
Некоторые функции (например, realpath(...)
) требуют
#define _BSD_SOURCE
который будет вставлен поверх вашего файла.