Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 创建使用Boost ASIO且不公开它的静态库_C++_Boost_Boost Asio - Fatal编程技术网

C++ 创建使用Boost ASIO且不公开它的静态库

C++ 创建使用Boost ASIO且不公开它的静态库,c++,boost,boost-asio,C++,Boost,Boost Asio,我正在尝试创建一个库,它使用BoostASIO(UDP多播,异步),并且不公开它。基本上,我遵循的是异步udp示例,只是我将io_服务对象设置为库的静态私有成员 如果直接编译成可执行文件,代码工作正常。如果我尝试创建一个静态库,然后在应用程序中使用它,那么代码在构建类时会抛出异常 如果有人有示例或创建了一个使用Boost ASIO的库,并且没有公开它,并且可以发表评论,我将非常感谢您的帮助 我还尝试将io_服务作为类的私有成员,并尝试将其传递给构造函数。到目前为止,我所尝试的一切都抛出了异常 以

我正在尝试创建一个库,它使用BoostASIO(UDP多播,异步),并且不公开它。基本上,我遵循的是异步udp示例,只是我将io_服务对象设置为库的静态私有成员

如果直接编译成可执行文件,代码工作正常。如果我尝试创建一个静态库,然后在应用程序中使用它,那么代码在构建类时会抛出异常

如果有人有示例或创建了一个使用Boost ASIO的库,并且没有公开它,并且可以发表评论,我将非常感谢您的帮助

我还尝试将io_服务作为类的私有成员,并尝试将其传递给构造函数。到目前为止,我所尝试的一切都抛出了异常

以下是库的示例代码:

#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
};
\ifdef\u库
静态boost::asio::io_服务asio_服务;
#恩迪夫
类udpframereader
{
公众:
udpframereader():m_套接字(asio_服务)
{
m_packetCount=0;
...
}
无符号长asio_错误计数();
...
#ifdef_LIB
私人:
无效句柄接收(const boost::system::error\u code&error,std::size\u t bytes\u transfer);
boost::asio::ip::udp::socket m_socket;
boost::asio::ip::udp::endpoint m_remote_endpoint;
boost::数组m_缓冲区;
boost::crc_ccitt_类型m_crc;
无符号长m_包装计数;
...
#恩迪夫
};

您不能像您所展示的那样在库和应用程序之间更改类的定义;这将导致(除其他外)应用程序和库在对象大小方面存在分歧,从而在尝试初始化这些对象时导致缓冲区溢出


如果要隐藏对象的私有实现,请使用,并且不要向应用程序公开实现类。

那些
ifdef\u LIB
s有什么用?@bdonlan
ifdef\u LIB
允许我在库和使用库的应用程序中使用相同的.h文件<代码>\u LIB在应用程序使用时未定义。另外,构造函数实际上在一个单独的cpp文件中,但我复制粘贴了它,只是为了展示它的外观。您会遇到什么异常?您不能像以前那样通过
\u LIB
进行条件编译。在C++中,库中的<代码> UPDFRAMEADED<代码>的类定义必须与库的用户所看到的相同。除了C++之外,C++还必须为每个代码分配相同大小的数据结构。基本上,面向客户机的类有一个指向用户不需要的不同结构的指针。这会隐藏实现细节,但会增加运行时开销,并且库代码可能会变得难以阅读。