Использование экземпляра класса stati c singleton приводит к сбою при динамической загрузке c - PullRequest
0 голосов
/ 09 января 2020

Я делаю общую библиотеку, которая экспортирует функцию, которая использует экземпляр класса stati c. Общая библиотека предназначена для динамической загрузки. Однако по какой-то причине использование экземпляра класса stati c приводит к сбою загрузки dynamici c. Я загружаю библиотеку, используя Poco.

//my_library.h
#ifndef MY_LIB_H
#define MY_LIB_H

#define DUMMY_MSG 1;

class SendClass
{
  public:
    SendClass() = default;
    SendClass( const SendClass &other ) = delete;
    SendClass &operator=( const SendClass &other ) = delete;

    static SendClass *get_instance(){ return &singleton_instance; };

    int send(){ return DUMMY_MSG; };

  private:
    static SendClass singleton_instance;
};

extern "C" __attribute__ ((visibility ("default"))) int send();//this is the function to be exported

inline int send()
{
  return SendClass::get_instance()->send();
}

#endif // MY_LIB_H

Я скомпилировал вышеуказанный заголовочный файл в общую библиотеку, используя команду ниже, и поместил библиотеку в / tmp /

g++ -shared -fPIC -o libexp.so my_library.h

И затем я пытаюсь загрузить библиотеку в моей основной программе

//main.cpp
#include "Poco/SharedLibrary.h"

using namespace std;

typedef int(*SENDFUNC)();

int main
(
  int argc,
  char **argv
)
{
    Poco::SharedLibrary lib;
    lib.load( "/tmp/libexp.so" );    //crashes here!
    SENDFUNC send_func = (SENDFUNC)lib.getSymbol("send");
    int msg = send_func();
    return 0;
}

Программа вылетает в строке "lib.load (" /tmp/libexp.so ");" со следующим сообщением:

завершить вызов после выброса экземпляра
'Poco :: LibraryLoadException' what (): Невозможно загрузить библиотеку

Однако, если я измените тело SendClass :: get_instance следующим образом: загрузка динамического файла c успешно завершена

//if SendClass::get_instance is implemented as follows, dynamic loading succeeds    
static SendClass *get_instance(){ return new SendClass; };

Так почему использование экземпляра stati c вызывает сбой загрузки динамического интерфейса c?

1 Ответ

0 голосов
/ 09 января 2020

По совету @ ALX23z я решил проблему, добавив следующий cpp файл

//my_library.cpp
#include "my_library.h"

SendClass SendClass::singleton_instance;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...