我正在尝试创建一个使用Boost ASIO(UDP多播,异步)并且不公开它的库。基本上我遵循异步udp示例,除了我已经使io_service对象成为库的静态私有成员。
如果直接编译成可执行文件,代码可以正常工作。如果我尝试创建一个静态库然后在应用程序中使用它,代码会在构造我的类时抛出异常。
如果有人有示例或已经创建了一个使用Boost ASIO的库并且没有公开它并且可以发表评论我非常感谢帮助。
我也试过让io_service成为该类的私有成员,并尝试将其传递给构造函数。到目前为止我尝试的所有东西都抛出异常。
以下是该库的示例代码:
#ifdef _LIB
static boost::asio::io_service asio_service;
#endif
class udpframereader
{
public:
udpframereader() : m_socket(asio_service)
{
m_packetCount = 0;
...
}
unsigned long long asio_error_count();
...
#ifdef _LIB
private:
void handle_receive(const boost::system::error_code& error, std::size_t bytes_transferred);
boost::asio::ip::udp::socket m_socket;
boost::asio::ip::udp::endpoint m_remote_endpoint;
boost::array<char, 4096> m_buffer;
boost::crc_ccitt_type m_crc;
unsigned long long m_packetCount;
...
#endif
};
答案 0 :(得分:1)
您无法像显示的那样更改库和应用程序之间的类定义;这会导致(除其他外)应用程序和库不同意对象的大小,当您尝试初始化这些对象时导致缓冲区溢出。
如果要隐藏对象的私有实现,请使用pImpl idiom,并且不要将实现类公开给应用程序 。