2015-09-16 80 views
2

我試圖用升壓試驗單位編譯使用Boost測試單位++ 11

#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的升壓1.59

  • Cygwin的G ++ 4.9.3

任何幫助將受到歡迎。謝謝。 José.-

+0

「mkstemp」不是C++標準函數。你嘗試過'std = gnu ++ 11'來獲得一些擴展嗎? –

+0

@BoPersson作品。請將您的評論作爲答案。 我以爲'std = C++ 11'和'std = gnu ++ 11'在只安裝gnu C++的環境中是一樣的:c。請你解釋一下爲什麼會發生這種情況? –

+1

這只是一個猜測。這些選項就像「嚴格的C++標準」vs「一些Posix和東西添加」。我不知道確切的細節。 –

回答

3

看起來像是Cygwin的東西。我無法使用Boost 1.54在OpenSUSE 13.2 i586上重現它,但在Cygwin Win32和Boost 1.57上獲得的結果與您的結果相同。並且,作爲博佩森建議,也嘗試std=gnu+11

當編譯器sayd「不宣佈」 - 即使你明確地包括<stdlib.h>該聲明既mkstempputenv, - 這似乎令人懷疑,我認爲這是所有關於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 s到你的程序:

#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個字節(除了指紋)。