Компиляция с использованием Boost Test Unit в std c ++ 11

Я пытаюсь скомпилировать очень простую программу, используя Boost Test Unit

#define BOOST_TEST_MODULE My Test
#include <boost/test/included/unit_test.hpp>

BOOST_AUTO_TEST_CASE(first_test) {   int i = 1;   BOOST_CHECK(i == 1); }

Если я скомпилирую эту маленькую программу без параметров,

g++ test1.cpp

нет проблем. Но если я попытаюсь использовать стандарт C ++ 11,

g++ test1.cpp -std=c++11

Я получаю некоторые ошибки:

In file included from /usr/include/boost/test/included/unit_test.hpp:19:0,
from test1.cpp:2: /usr/include/boost/test/impl/debug.ipp: En la función ‘const char* boost::debug::{anónimo}::prepare_gdb_cmnd_file(const boost::debug::dbg_startup_info&)’: /usr/include/boost/test/impl/debug.ipp:426:23: error: ‘::mkstemp’ no se ha declarado
fd_holder cmd_fd( ::mkstemp( cmd_file_name ) );
^ In file included from /usr/include/boost/test/included/unit_test.hpp:19:0,
from test1.cpp:2: /usr/include/boost/test/impl/debug.ipp: En la función ‘bool boost::debug::attach_debugger(bool)’: /usr/include/boost/test/impl/debug.ipp:863:34: error: ‘::mkstemp’ no se ha declarado
fd_holder init_done_lock_fd( ::mkstemp( init_done_lock_fn ) );
^ In file included from /usr/include/boost/test/utils/runtime/cla/dual_name_parameter.hpp:19:0,
from /usr/include/boost/test/impl/unit_test_parameters.ipp:31,
from /usr/include/boost/test/included/unit_test.hpp:33,
from test1.cpp:2: /usr/include/boost/test/utils/runtime/config.hpp: En la función ‘void boost::runtime::putenv_impl(boost::runtime::cstring, boost::runtime::cstring)’: /usr/include/boost/test/utils/runtime/config.hpp:95:51: error: ‘putenv’ no se declaró en este ámbito
putenv( const_cast<char*>( fs.str().c_str() ) );

(Компилятор на испанском языке)

Я использую:

  • Cygwin 64 бит

  • Cygwin’s Boost 1.59

  • Cygwin’s G ++ 4.9.3

Любая помощь будет приветствоваться. Благодарю.
José.-

2

Решение

Похоже, это вещь Cygwin. Я не смог воспроизвести его на OpenSUSE 13.2 i586 с Boost 1.54, но получил тот же результат, что и ваш на Cygwin Win32 с Boost 1.57. И в качестве Бо Перссон предложил, также попробовал std=gnu+11,

Как сказал компилятор «не объявленный«- даже если вы явно включите <stdlib.h> который объявляет оба mkstemp а также putenvМне показалось сомнительным, что это все о расширениях языка C ++, а скорее о проблеме файла заголовка. Действительно, в Linux мы имеем:

#if defined __USE_MISC || defined __USE_XOPEN_EXTENDED \
|| defined __USE_XOPEN2K8
# ifndef __USE_FILE_OFFSET64
extern int mkstemp (char *__template) __nonnull ((1)) __wur;
# else
#  ifdef __REDIRECT
extern int __REDIRECT (mkstemp, (char *__template), mkstemp64)
__nonnull ((1)) __wur;
#  else
#   define mkstemp mkstemp64
#  endif
# endif
# ifdef __USE_LARGEFILE64
extern int mkstemp64 (char *__template) __nonnull ((1)) __wur;
# endif
#endif

Но в Cygwin:

#ifndef __STRICT_ANSI__
#ifndef _REENT_ONLY
int _EXFUN(mkstemp,(char *));
#endif
int _EXFUN(_mkstemp_r, (struct _reent *, char *));
#endif

Затем я добавил пару #undefс вашей программой:

#undef __STRICT_ANSI__
#undef _REENT_ONLY

#define BOOST_TEST_MODULE My Test
#include <boost/test/included/unit_test.hpp>

BOOST_AUTO_TEST_CASE(first_test) {   int i = 1;   BOOST_CHECK(i == 1); }

И может скомпилировать это нормально с std=c++11, Я понятия не имею, насколько это может быть неверно и глупо, но, по крайней мере, это очень похоже EXE файл, который отличается только на 20 байтов (кроме отпечатка пальца).

3

Другие решения


А ты уже прошел курс программирования? Супер скидка!
Прокачать скилл $$$
×