0

我正在尝试在 Windows 上使用 boost 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

这为我敲响了警钟;我想我必须解决同样的问题一次。我相信某些版本的 Windows 中没有指定 ASIO 使用的一些错误代码。尝试使用以下内容:

-D_WIN32_WINNT=0x0501

这将构建目标设置为最低 Windows XP(我相信)。

于 2013-11-08T07:39:53.540 回答
0

最后,似乎是cygwin-gcc和构建DLL的问题。

在我使用 boost、cygwin/gcc 和 eclipse(例如 dynamic_pointer_cast 未终止,导致无限循环)遇到一些更奇怪的错误之后,我切换到 VisualStudio '12,一切都像一个魅力......

于 2013-11-08T07:30:50.850 回答