0

Windows でブースト 1.54.0 を使用しようとしていますが、asio::deadline_timer で問題が発生しました。

これが私の(非常に単純な)コードです:

#include <boost/asio.hpp>
using boost::asio::deadline_timer;

int main() {  
    deadline_timer timeout;
}

gcc 4.7 (cygwin) を使用してこのスニペットをコンパイルしようとすると、次のエラーが発生します。

g++ -D__USE_W32_SOCKETS -D_WIN32_WINNT "-IC:\\dev\\lib\\boost_1_54_0" "-IC:\\dev\\workspace-cpp\\ts_core\\src" -O0 -g3 -Wall -c -fmessage-length=0 -o "src\\main.o" "..\\src\\main.cpp" 
In file included from C:\dev\lib\boost_1_54_0/boost/asio/detail/impl/posix_tss_ptr.ipp:24:0,
                 from C:\dev\lib\boost_1_54_0/boost/asio/detail/posix_tss_ptr.hpp:77,
                 from C:\dev\lib\boost_1_54_0/boost/asio/detail/tss_ptr.hpp:27,
                 from C:\dev\lib\boost_1_54_0/boost/asio/detail/call_stack.hpp:20,
                 from C:\dev\lib\boost_1_54_0/boost/asio/impl/handler_alloc_hook.ipp:19,
                 from C:\dev\lib\boost_1_54_0/boost/asio/handler_alloc_hook.hpp:80,
                 from C:\dev\lib\boost_1_54_0/boost/asio/detail/handler_alloc_helpers.hpp:21,
                 from C:\dev\lib\boost_1_54_0/boost/asio/detail/bind_handler.hpp:19,
                 from C:\dev\lib\boost_1_54_0/boost/asio/detail/wrapped_handler.hpp:18,
                 from C:\dev\lib\boost_1_54_0/boost/asio/io_service.hpp:25,
                 from C:\dev\lib\boost_1_54_0/boost/asio/basic_io_object.hpp:19,
                 from C:\dev\lib\boost_1_54_0/boost/asio/basic_socket.hpp:20,
                 from C:\dev\lib\boost_1_54_0/boost/asio/basic_datagram_socket.hpp:20,
                 from C:\dev\lib\boost_1_54_0/boost/asio.hpp:21,
                 from ..\src\main.cpp:8:
C:\dev\lib\boost_1_54_0/boost/asio/error.hpp:77:17: error: a function call cannot appear in a constant-expression
C:\dev\lib\boost_1_54_0/boost/asio/error.hpp:130:15: error: a function call cannot appear in a constant-expression
C:\dev\lib\boost_1_54_0/boost/asio/error.hpp:135:19: error: a function call cannot appear in a constant-expression
C:\dev\lib\boost_1_54_0/boost/asio/error.hpp:149:23: error: a function call cannot appear in a constant-expression
C:\dev\lib\boost_1_54_0/boost/asio/error.hpp:163:15: error: a function call cannot appear in a constant-expression
..\src\main.cpp: In function 'int main()':
..\src\main.cpp:24:17: error: no matching function for call to 'boost::asio::basic_deadline_timer<boost::posix_time::ptime>::basic_deadline_timer()'

調査に時間を費やし、「-D__USE_W32_SOCKETS -D_WIN32_WINNT」を追加しましたが、成功しませんでした。問題は、main.cpp の 8 行目の "#include " 行にあるようです。

4

4 に答える 4

3

boost::asio::deadline_timer にはデフォルトの空のコンストラクターがありません。あなたが使用する必要があります:

boost::asio::io_service _iosvc;
boost::asio::deadline_timer timer(_iosvc);
于 2013-11-01T06:08:00.687 に答える
2

ビルド構成に問題があるようです。あなたが言及したすべての行BOOST_ASIO_WIN_OR_POSIXは、posixへの呼び出しとネイティブwin実装の詳細との間の切り替えであるマクロへの呼び出しです。あなたの設定がどういうわけかそれを台無しにして、間違ったヘッダーを含めたり、マクロを間違って展開したりしているようです。マクロ定義は基本的に次のようになります。

#if defined(BOOST_ASIO_WINDOWS) || defined(__CYGWIN__)
# define BOOST_ASIO_WIN_OR_POSIX(e_win, e_posix) e_win
#else
# define BOOST_ASIO_WIN_OR_POSIX(e_win, e_posix) e_posix
#endif

したがって、最初の質問: は__CYGWIN__ビルド中に定義されますか?

于 2013-11-01T07:20:46.527 に答える
1

これは私にとって鐘を鳴らします。私は一度同じ問題を回避しなければならなかったと思います。ASIO が使用するエラー コードの一部は、特定のバージョンの Windows では指定されていないと思います。以下を使用してみてください。

-D_WIN32_WINNT=0x0501

これは、ビルドを最小の Windows XP にターゲットを絞っています (私は信じています)。

于 2013-11-08T07:39:53.540 に答える