Создание статической библиотеки, которая использует Boost ASIO и не раскрывает ее - PullRequest
3 голосов
/ 19 сентября 2011

Я пытаюсь создать библиотеку, которая использует Boost ASIO (UDP multicast, асинхронный) и не раскрывает ее. По сути, я следую примеру async 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
};

1 Ответ

1 голос
/ 20 сентября 2011

Вы не можете изменить определение класса между библиотекой и приложением, как вы показываете; это может привести (помимо прочего) к тому, что приложение и библиотека не согласятся с размером объекта, что приведет к переполнению буфера при попытке инициализации этих объектов.

Если вы хотите скрыть частную реализацию объекта, используйте идиому pImpl , и вообще не открывайте класс реализации для приложения .

...