2014-11-11 5 views
2

Я пытался изучить модульное тестирование самостоятельно, следуя книге.C++: модульное тестирование с использованием Google Mock с кодом :: Blocks, MinGW и C++ 11

Код в книге использовать стандарт C++ 11 и имеют такую ​​строку:

auto variable = function(parameter); 

Когда я первый скомпилирован я получил это предупреждение:

warning: 'auto' changes meaning in C++11; please remove it [-Wc++0x-compat]

Нет Biggie, я можно было бы исправить это, установив следующий флажок в меню Project-> Build options ...:

[ ] Have g++ follow the C++ 11 ISO C++ language standard [-std=c++11]

Теперь, однако, я получаю новый сферические зеркала, связанные с Google Mock в GTEST-port.h:

| | In function 'int testing::internal::posix::StrCaseCmp(const char*, const char*)':

|1719| error: '_stricmp' was not declared in this scope

| | In function 'char* testing::internal::posix::StrDup(const char*)':

|1721| error: '_strdup' was not declared in this scope

| | In function 'FILE* testing::internal::posix::FDOpen(int, const char*)':|

|1779| error: 'fdopen' was not declared in this scope

Поиск по этой проблеме дали мало для меня, но я стараюсь и определить целевую ОС, как это было предложено решением в случае, если он не был правильно идентифицирован автоматически. Добавление GTEST_OS_WINDOWS = 1 и/или GTEST_OS_WINDOWS_DESKTOP = 1 в проектах не изменило ничего.

Я понимаю, что это легко можно зафиксировать в этом случае, просто указав правильный тип вместо автоматического использования, но я хотел бы найти решение для этого, если это возможно. Замена авто и отсутствие опции -std = C++ 11 позволяет коду работать так, как предполагалось, так что библиотека работает.

Я использую Code :: Blocks 13.12, MinGW/g ++ 4.8.1-4 и Google Mock 1.7 в Windows.

Спасибо за чтение =)

+1

Попробуйте '--std = gnu ++ 11' – sjdowling

+0

Спасибо, что я работал! Кажется, не получается, как отметить отличный ответ в качестве ответа на вопрос. Я постараюсь понять это. – Pzc

ответ

2

Ответ здесь лежит в функциях, которые отсутствуют объявления: _stricmp, _strdup и fdopen. Первые два являются версиями Microsoft функций POSIX stricmp и strdup. Обратите внимание, что вы указываете использование стандарта ISO C++ 11, который не содержит элементов в стандарте POSIX. Указав --std=gnu++11, вы сообщаете компилятору принять гибрид C++ 11 и POSIX вместе с расширениями GNU.

Интересно, что я не могу реплицировать это с помощью GCC 4.8.2 на Linux, поэтому есть возможность чего-то еще в заголовках Google Mock при компиляции в Windows.