创建使用Boost ASIO而不公开它的静态库

Creating static library that uses Boost ASIO and does not expose it

本文关键字:静态 Boost ASIO 创建      更新时间:2023-10-16

我正在尝试创建一个使用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
};

您不能像您所示的那样在库和应用程序之间更改类的定义;这将导致应用程序和库对对象的大小不一致,从而在尝试初始化这些对象时导致缓冲区溢出。

如果您想隐藏对象的私有实现,请使用pImpl习惯用法,并且根本不向应用程序公开实现类